Debe usar tipos consistentes para los objetos declarados en diferentes unidades de traducción.
Dado int a[] = {2, 3};
, cualquiera de las declaraciones extern int a[];
o extern int a[2]
; sería compatible, mientras que extern int *a;
no como punteros y matrices son tipos completamente separados.
La única cosa especial acerca de las matrices es el cuando el nombre de una matriz aparece en cualquier contexto expresión que no sea como un operando a "dirección de" (unario &
) o sizeof
, se convierten automáticamente a un puntero a su primera elemento.Esto es lo que proporciona la compatibilidad de sintaxis entre matrices e indicadores, pero no son del mismo tipo.
Considere estas dos funciones para un ejemplo comentado. Tenga en cuenta que la expresión a
se convierte en un puntero a su primer elemento en la segunda (y técnicamente tercera) printf
de la primera función, pero no en la primera printf
donde es el operando a &
.
#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 que utilizo para imprimir %p
punteros y convertir explícitamente a void*
.
¿Está utilizando un sistema operativo de 64 bits? –
@PaulR Yo uso 32 bits ubuntu 12.04 –