duvida em C

MPalhas

Power Member
comecei a pouco tempo a aprender a linguagem C, e estava hoje a ler um tutorial que tenho seguido. terminei a secção de ponteiros e estava a fazer um exercicio que lá tinha, que consiste em, numa matriz bidimensional 10x10, colocar todos os valores a 0, depois preencher a matriz com números de um a 100, e depois mostrar esses mesmos valores, tudo isto usando ponteiros.

aqui está o código que eu fiz para o exercicio
Código:
#include <stdio.h>
int main()
{
  int mtz[10][10], *p, x;
  
  /* poe a zero todos os valores da matriz */
  p=mtz[0];
  for (x=0;x<100;x++)
  {
    *p=0;
    p++;
  }

  /* preenche a matriz com nºs de 1 a 100 */
  p=mtz[0];
  x=0;
  for(x=0;x<100;x++)
  {
    *p=x+1;
    p++;
  }
  
  /* mostra os nºs da matriz (5 por linha) */
  p=mtz[0];
  for(x=0;x<20;x++)
  {
    printf("%5d", *(p++));
    printf("%5d", *(p++));
    printf("%5d", *(p++));
    printf("%5d", *(p++));
    printf("%5d\n", *(p++));
  }
}
e aqui está um printscreen do resultado ao executar este programa:


ora como talvez já tenham reparado, no ultimo ciclo FOR eu tenho 5 vezes seguidas a função printf. eu sei que posso juntar tudo isso num só printf, mas ai e que está o problema. se fizesse isso, então era só substituir todos esses printfs por isto:
Código:
printf("%4d %4d %4d %4d %4d\n", *(p++), *(p++), *(p++), *(p++), *(p++));
mas ao por assim, vejma o que acontece ao resultado:


porque é que da segunda maneira, cada linha fica na ordem inversa? não percebo mesmo...
 
não percebi muito bem a tua resposta, mas pesquisei um bocado, e pelo que percebi os parametros são avaliados da direita para esquerda, certo?

então quer dizer que tenho mesmo que usar a primeira forma que mostrei, com os 5 printfs?
 
não percebi muito bem a tua resposta, mas pesquisei um bocado, e pelo que percebi os parametros são avaliados da direita para esquerda, certo?

então quer dizer que tenho mesmo que usar a primeira forma que mostrei, com os 5 printfs?
Mais ou menos isso. O compilador assume que a ordem dos argumentos é irrelevante e optimiza o códiga tendo isso em conta. ;)

Sim, tens de usar os cinco printfs.
 
Boas
No extremo, se quiseres mesmo tudo numa linha poderias fazer algo desta maneira
Código:
printf("%4d %4d %4d %4d %4d\n", *(p++)-4, *(p++)-2, *(p++), *(p++)+2, *(p++)+4);
Deste modo, ele à direita avança no *p e dá mais 4 ao valor (sem interferir no valor apontado) de modo a conseguires os 5 ( 1 + 4 = 5) que queres ter à direta, depois no penúltimo como ele já antes tinha feito um *p++ e faz agora um novo somas apenas 2, isto é, (4-2), e assim sucessivamente...

cumpzz
 
Última edição:
Back
Topo