2011-03-26 16 views
7

La salida del siguiente programauso de operador sizeof

#include<stdio.h> 
int main(){ 
    int *p[10]; 
    printf("%ld %ld\n",sizeof(*p),sizeof(p)); 
} 

es

8 <--- sizeof(*p) gives size of single element in the array of int *p[10] 
80 <--- sizeof(p) gives size of whole array which is 10 * 8 in size. 

ahora ver el siguiente programa

#include<stdio.h> 
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0])) 
int array[] = {23,34,12,17,204,99,16}; 

    int main() 
    { 
     int d; 
     printf("sizeof(array) = %ld \n",sizeof(array)); 
     printf("sizeof(array[0]) = %ld \n",sizeof(array[0])); 
     printf("sizeof int %ld\n",sizeof(int)); 
     printf("TOTAL_ELEMENTS=%ld \n",TOTAL_ELEMENTS); 
     for(d=-1;d <= (TOTAL_ELEMENTS-2);d++) 
      printf("%d\n",array[d+1]); 

     return 0; 
    } 

se

sizeof(array) = 28 
sizeof(array[0]) = 4 <--here 
sizeof int 4 
TOTAL_ELEMENTS=7 

Lo que no puedo entender es por qué el tamaño de (matriz [0]) es diferente en ambas salidas.

+2

Creo que uno es compilado por un equipo de 64 bits, la otra para 32 bits. – groovingandi

+0

@groovingandi int tiene 4 bytes incluso en máquinas de 64 bits –

+0

@groovingandi no estos dos programas se ejecutaron en la misma máquina. –

Respuesta

11

int *p[10]; es una matriz de punteros.

*p es el primer elemento de esa matriz de punteros. Entonces es un puntero a un entero. No es un número entero.

int array[] = {23,34,12,17,204,99,16}; es una matriz de números enteros. Entonces, array[0] es el primer elemento de esa matriz. Entonces es un número entero.

El tamaño de un puntero a un número entero (*p) y un número entero (array[0]) son diferentes.

Entonces sizeof(*p) y sizeof(array[0]) son diferentes.

sizeof(p) da el tamaño de la matriz de punteros. Por lo que es: 10 x 8 = 80.
x es decir (número de elementos) (tamaño de un elemento)

sizeof(array) da el tamaño de la matriz de enteros. Por lo que es: 7 x 4 = 28.

+0

gracias por aclarar sobre * p ¿a qué se evalúa sizeof (p) y qué hay sobre array [0]? –

+0

@Registered Agregué más información. Ver si son útiles. –

+0

sí, su información fue útil. Si es posible, brinde un enlace para esta información. –

1

En el primer caso, que ha creado una matriz de punteros a int, por lo que su tamaño es de 8, no 4.

3

En el primer ejemplo, el elemento es un puntero a int, mientras que en el segundo ejemplo, es solo int. Puede ver que el puntero tiene 8 bytes, el int solo 4 bytes.

+0

Lalinsky en realidad no soy capaz de entender este concepto fácilmente. Leí y leí Kerninghan Ritchie si puedes dar algún enlace que será genial. –

1

En el primer ejemplo se usa el tamaño de un puntero y en el segundo el tamaño de un entero. Pueden tener diferentes tamaños, especialmente en sistemas de 64 bits.

1

array[0] tiene tipo int

*p tiene tipo int*

Esto tal vez demuestra la locura estilística de la escritura

int *p[10] ; 

en lugar de

int* p[10] ; 

donde el segundo hace que sea más claro que int * es el tipo de la matriz que se está declarando.

+0

Nunca me encontré int * hasta hoy siempre he usado int * p ¿me puedes dar alguna enlace a lo que dijiste? –

+0

@ Usuario Registrado: Son sintácticamente idénticos, como mencioné, es una elección estilística. Sin embargo, 'int *' describe un tipo de datos, por lo que tiene sentido dejar eso en claro al abrazar el modificador de tipo '*' a su tipo base 'int' en lugar de al identificador' p' - no es parte del identificador. – Clifford

+0

@Registered: PD: Mucha gente no estará de acuerdo conmigo, pero es el estilo ejemplificado por Bjarne Stroustrup aquí: http://www2.research.att.com/~bs/bs_faq2.html (Sé que es C++, pero esta elección de estilo se aplica a C también). – Clifford