È necessario utilizzare tipi coerenti per oggetti dichiarati in diverse unità di traduzione.
Dato int a[] = {2, 3};
, una delle dichiarazioni extern int a[];
o extern int a[2]
; sarebbe compatibile considerando che extern int *a;
non sarebbe come puntatori e matrici sono tipi completamente separati.
L'unica cosa speciale sui gruppi è il quando il nome di un array appare in qualsiasi contesto espressione diverso come operando a "indirizzo" (unario &
) o sizeof
, essi vengono convertiti automaticamente a un puntatore alla loro prima elemento.Questo è ciò che fornisce la compatibilità della sintassi tra array e puntatori, ma non sono dello stesso tipo.
Considerare queste due funzioni per un esempio commentato. Notare che l'espressione a
viene convertita in un puntatore al suo primo elemento nella seconda (e tecnicamente terza) printf
della prima funzione, ma non nel primo printf
dove è l'operando su &
.
#include <stdio.h>
void print_array_info(void)
{
extern int a[];
printf("address of a: %p\n", (void*) &a); // prints address of a
printf(" converted a: %p\n", (void*) a); // prints address of a[0]
printf("value of a[0]: %x\n", a[0]); // prints value of a
}
void print_pointer_info(void) {
extern int a[];
int *b = a; // == &a[0]
printf("address of b: %p\n", (void*) &b); // prints address of b
printf(" value of b: %p\n", (void*) b); // prints value of b (== &a[0])
printf("value of b[0]: %x\n", b[0]); // prints value of b[0] (== a[0])
}
Nota che uso %p
stampare puntatori ed esplicitamente gettato a void*
.
fonte
2012-06-23 09:22:30
Stai utilizzando un sistema operativo a 64 bit? –
@PaulR Io uso Ubuntu a 32 bit 12.04 –