PDA

View Full Version : Problemi con Output di un programma in C


::tony design
14-09-2003, 09:54
Devo iniziare il 2° anno di informatica:
questo è l'esercizio di C:

----------------------
Qual è l'output del seguente frammento di codice ?

#include <stdio.h>

int main()
{
int V[] = {1,3,5,7,9};
int *p;

printf("%d\n", V[1]);
printf("%d\n", *(V+2));
p = V+1;
printf("%d\n", *p);
printf("%d\n", *(p+2));
p = &V[1];
printf("%d\n", *p);
printf("%d\n", *p+1);
getch();
}

L'output ho visto che è:

3
5
3
7
3
4

qualcuno mi spiega passaggio per passaggio perchè ??
per esempio cosa significa *(V+2) ????

Garzie a tutti
::tony:muro:

cionci
14-09-2003, 10:18
Non chiamarlo problemi di output xchè sono problemi di comprensione del linguaggio ;)

V è un vettore di 5 elementi...
p è un puntatore ad intero...

Nella prima printf stampa V[1] cioè 3...
Nella seconda stampa *(V+2) cioè il contenuto (*) dell'indirizzo puntato da V+2... V equivale all'indirizzo di V[0]...quindi V+2 equivale all'indirizzo di V[2]...
p = V + 1 assegna a p l'indirizzo di V[1] (V+1 equivale a &V[1])...
La terza printf stampa il contenuto (*) dell'indirizzo puntato da p, cioè V[1]...
La quarta stampa il contenuto (*) dell'indirizzo puntato da p+2, cioè V[3]...

p = &V[1] assegna a p l'indirizzo (&) di V[1]...
La quinta printf stampa il contenuto (*) di p...cioè V[1]...
La sesta stampa il contenuto (*) di p (cioè V[1]) e ci aggiunge 1...cioè stampa 4...

::tony design
14-09-2003, 10:41
Originariamente inviato da cionci
Non chiamarlo problemi di output xchè sono problemi di comprensione del linguaggio ;)

V è un vettore di 5 elementi...
p è un puntatore ad intero...

Nella prima printf stampa V[1] cioè 3...
Nella seconda stampa *(V+2) cioè il contenuto (*) dell'indirizzo puntato da V+2... V equivale all'indirizzo di V[0]...quindi V+2 equivale all'indirizzo di V[2]...
p = V + 1 assegna a p l'indirizzo di V[1] (V+1 equivale a &V[1])...
La terza printf stampa il contenuto (*) dell'indirizzo puntato da p, cioè V[1]...
La quarta stampa il contenuto (*) dell'indirizzo puntato da p+2, cioè V[3]...

p = &V[1] assegna a p l'indirizzo (&) di V[1]...
La quinta printf stampa il contenuto (*) di p...cioè V[1]...
La sesta stampa il contenuto (*) di p (cioè V[1]) e ci aggiunge 1...cioè stampa 4...

Ti ringrazio

ciao ciao
::tony

::tony design
14-09-2003, 10:58
Ho un'altro problema:

Devo riscrivere questo frammento di codice con due cicli annidati while:

#include <stdio.h>

int main()
{
int i1,i2;
for(i1=2; i1 < 10; i1 += 2)
{
for(i2 = 12; i2 > i1; --i2)
printf("X");
printf("\n");
}
getch();
}

Io ho provato in questo modo, ma l'output è diverso: :muro:

#include <stdio.h>

int main()
{
int i1,i2;
i1 = 2;
while(i1 < 10)
{
i2 = 12;
while(i2 > i1)
{
printf("X");
printf("\n");
--i2;
}
i1 += 2;
}
getch();
}

Grazie ancora...

::tony :mc:

cionci
14-09-2003, 11:04
#include <stdio.h>

int main()
{
int i1,i2;
i1 = 2;
while(i1 < 10)
{
i2 = 12;
while(i2 > i1)
{
printf("X");
--i2;
}
printf("\n");
i1 += 2;
}
getch();
}
Come vedi printf("\n") è al di fuori del ciclo + interno... Il for accetta un solo statement oppure un blocco di parentesi {}...