2010-09-03 27 views
9

Qui di seguito sono 2 programmiperché diverse risposte?

First

#include<stdio.h> 

void main() 
{ 
    int a[5]={1,2,3,4,5}; 
    int *p; 
    p=&a; 
    printf("%u %u",p,p+1); 
} 

Seconda

#include<stdio.h> 

void main() 
{ 
    int a[5]={1,2,3,4,5}; 
    printf("%u %u",&a,&a+1); 
} 

Ora, nei due programs..I hanno stampato i valori di & un utilizzo p in prima codice e direttamente nel secondo ..

Perché i risultati sono diversi?

la risposta che sto ottenendo sono.

for first 3219048884 3219048888 
for second 3219048884 3219048904 
+1

La prego di formattare i righe di codice con il tasto codice nell'editor? Rende molto più facile per le persone dare una mano. – jlafay

+2

Quali sono i risultati che ottieni? –

+2

E quali sono i risultati che vedi? –

risposta

14

Il tipo di &a è int (*) [5]. Pertanto, &a+1 è un puntatore che è 5 int s più avanti di a. Tuttavia, il tipo di p è int *, pertanto p+1 è un puntatore che è 1 int oltre lo p.

+0

Subdolo! Approvo. –

+0

Sì, ma è irrilevante con la domanda tranne l'ultimo valore della serie – kriss

+1

@kriss: come è irrilevante? È l'ultimo valore in ogni sequenza che differisce, ed è per questo. –

-2

Si dovrebbe usare p = a e non p = &a. Un array come a è già assunto come puntatore costante. Non è necessario dereferenziarlo con l'operatore &.

+0

'a' non è un puntatore. Mai e poi mai. – GManNickG

+0

@GMan Perché allora puoi dire '* a = 2' con lo stesso significato di' a [0] = 2'? – Frank

+0

Poiché gli array hanno una conversione implicita al puntatore. Ma gli array non sono puntatori. – GManNickG

2

In entrambi i programmi, si stampano gli indirizzi di memoria dell'array.

Questo può variare ogni volta che si esegue il programma. La memoria che il sistema operativo sceglie di darti può essere diversa.

Quando il programma dichiara un array di 5 numeri interi, il sistema operativo promette di fornire 5 numeri interi consecutivi, NON promette quale memoria si otterrà, o che si otterrà la stessa memoria ogni volta.

7

Quando eseguo che, ottengo questo:

1245036 1245040 1245036 1245040 
1245036 1245040 1245036 1245056 

con l'unica differenza che in ultima posizione, p+1 vs &a+1

p è un puntatore ad un intero, in modo da p+1 è l'indirizzo del prossimo numero intero. (vale a dire 4 byte più avanti nel memeory)

a è un array di 5 numeri interi, quindi & a + 1 è l'indirizzo dell'array successivo di 5 numeri interi. (vale a dire 20 byte ulteriormente nel memeory)

1

Il primo programma non è valido. È illegale assegnare p = &a, poiché p ha tipo int * e &a ha tipo int (*)[5]. Questi tipi non sono compatibili. Se il tuo compilatore è abbastanza lento da consentire questo tipo di incarico (ti ha almeno avvertito?), Probabilmente lo ha interpretato come p = (int *) &a, cioè reinterpreta con forza il valore di &a come un puntatore int *. Pertanto, tutta l'aritmetica del puntatore nel primo programma è aritmetica int *. Questo è il motivo per cui il primo programma produce la stessa uscita per i valori a+1 e p+1.

Nel secondo programma il valore di &a non viene reinterpretato. Mantiene il suo tipo originale `` int () [5] and it follows the rules of normal pointer arithmetic for type int () [5] , meaning that when you do & a + 1 , the pointer is moved sizeof (int [5]) `byte, come dovrebbe. Questo è il motivo per cui il risultato è diverso dal primo programma.

2

Si hanno due programmi con diversi frame di stack, non sorprende che gli indirizzi delle variabili locali siano diversi. Il può cambiare ogni volta che si esegue il programma (questo è ciò che fa quando lo provo, codice compilato con gcc su Linux).

Ma otterrete gli stessi valori con il programma sotto uno tranne l'ultimo valore della serie (tranne l'ultimo, a causa del modo in cui funziona l'aritmetica del puntatore).

#include<stdio.h> 

void main() 
{ 
    int a[5]={1,2,3,4,5}; 
    int *p; 
    p=&a; 
    printf("%u %u %u %u ",a,a+1,p,p+1); 
    printf("%u %u %u %u",a,a+1,&a,&a+1); 
} 

Per un (abbastanza) completa spiegazione di differenza tra puntatori e array si può guardare la mia risposta here

Problemi correlati