2012-02-16 19 views
6

avere il codice seguente:Come usare "pointer to array 10 of int"?

#include<stdio.h> 

int main() 
{ 
    int(* a)[10]; //declare a as pointer to array 10 of int 
    int b[10]; // taken a array of 10 int 
    b[2]=32;  
    a=&b;  
    printf("b is on %p\n",&b); 
    printf("a is on %p\n",a); 
    printf("magic is %d\n",a[2]); // why this is not showing 32 
    return 0; 
} 

uscita:

b is on 0xbfa966d4 
a is on 0xbfa966d4 
magic is -1079417052 

Qui ho preso a come puntatore a matrice 10 di int che punta alla matrice b, così ora perché non riesco a ottenere il valore di 32 su a[2]?

a[2] viene valutato come *(a+2) così ora un ha l'indirizzo di matrice b così *(b+2) e *(a+2) sono simili e allora perché non ricevo valore a 32 qui?


Edit: ho ottenuto risposta utilizzando

(*a)[2] 

ma io non ricevo come funziona ... vedere quando

a[2] è *(a+2) e a+2 è un più 2 * sizeof(int[10]) byte.

in questo modo (*a)[2] come espandere?

+0

(* a) [2] sarebbe lo stesso di [0] [2] – novice

risposta

6

dal regolamento di aritmetica dei puntatori, a[2] è *(a+2) e a+2 è a più 2 * sizeof(int[10]) byte.

(si pensi ad un normale int *p;. p+1 è p più sizeof(int) byte e (char *)(p + 1) è diverso da (char *)p + 1 oggi sostituiscono int con int[10])

+0

oyh questo è quello che mi è stato incompreso ... !! grazie –

+0

Funzionerebbe usando ((int *) a) [2] – Eregrith

+0

@Eregrith: Penso che violerebbe la rigida regola di aliasing e causerebbe un comportamento indefinito. –

7

Dal a è già un puntatore, è necessario dereferenziarlo al fine di riportare alla matrice che punti a:

(*a)[2] 
+0

Questo è chiamato "sostituzione di linea singola" :) –

-1

int b [10] == int* che punta al primo valore della matrice

int (* a) [10] == int** che puntano l'indirizzo di un puntatore che punta a una matrice

a+2 == (&b)+2

Spero che questo cancella le cose per voi

+0

Questo è sbagliato. 'b' non è' int * ',' a' non è 'int **', e 'int * a [10]' è diverso da 'int (* a) [10]'. – interjay

+0

@interjay Sì, il modo in cui l'ho scritto prima mi avrebbe prodotto un array di 10 int *. Ma 'b' è un' int * ' – Djole

+0

No,' b' non è un 'int *', ma può decadere in un 'int *' in alcuni contesti (non tutti). Tuttavia, 'a' non decadrà mai in un' int ** 'perché si comportano in modo completamente diverso. E anche la tua linea riguardo a 'a' che punta all'indirizzo di un puntatore è sbagliata. – interjay

1
#include<stdio.h> 

int main() 
{ 
    int(* a)[10]; //declare a as pointer to array 10 of int 
    int b[10]; // taken a arry of 10 int 
    b[2]=32;  
    a=&b;  
    printf("b is on %p\n",&b); 
    printf("a is on %p\n",a); 
    printf("magic is %p\n",a + 2); // Changed to show pointer arithmetic 
    return 0; 
} 

Questa stampa il seguente:

b is on 0xbfe67114 
a is on 0xbfe67114 
magic is 0xbfe67164 

Vedete che cosa sta succedendo? magic meno a equivale a 80, ovvero 4 * 10 * 2. Questo perché a è un puntatore a un array di dieci interi, quindi sizeof(*a) == 10 * sizeof(int) e non sizeof(a) == sizeof(int), che è ciò che si aspettava. La prossima volta fai attenzione ai tipi di aritmetica dei puntatori!

+0

l'ho capito..grazie .. !!! –

0

Non è stato possibile aggiungere un commento perché richiede 50 reputazione. Quindi ecco la mia domanda per la domanda pubblicata. Scusate se violerò alcune regole postando la domanda nella casella di risposta. Questa domanda mostra che dovremmo fare attenzione durante l'esecuzione dell'aritmetica del puntatore. Ma a che serve usare i puntatori su un array se la stessa cosa può essere fatta semplicemente usando i puntatori agli interi ....?