2009-07-05 13 views
11

Tengo un puntero a una matriz de enteros de 10. ¿Qué me debería dar la desreferenciación de este puntero?puntero de desreferenciación en la matriz de enteros

Ej:

#include<stdio.h> 

main() 
{ 
    int var[10] = {1,2,3,4,5,6,7,8,9,10}; 
    int (*ptr) [10] = &var; 

    printf("value = %u %u\n",*ptr,ptr); //both print 2359104. Shouldn't *ptr print 1? 


} 

Respuesta

15

Lo que eliminar la referencia es un puntero a una matriz. Por lo tanto, la desreferenciación le proporciona la matriz. Pasar una matriz a printf (o a cualquier función) pasa la dirección del primer elemento.

Usted le dice a printf que se le pasa un unsigned int (%u), pero en realidad lo que se pasa es un int*. Los números que ve son las direcciones del primer elemento de la matriz interpretada como unsigned int.

Por supuesto, este es un comportamiento indefinido. Si desea imprimir una dirección, debe usar %p y pasar un void*.

+0

O puede convertir a un tipo entero apropiado - como uintptr_t de '' ''y usar un elemento de formato apropiado, probablemente PRIuPTR (dice, trabajando desde una memoria escamosa). –

+0

litb, ¿me puede explicar qué significa "desreferenciación le da la matriz"? ¿De nuevo apunta a la matriz? o es la dirección del primer elemento? – chappar

+0

Te da lo mismo que nombrar "var" te daría: La matriz :) Por lo tanto, 'sizeof (* ptr) == 10 * sizeof (int)', y '& * ptr == int (*) [ 10] ' –

10

Cuando se declara

int var[10]; 

una referencia a var tiene tipo puntero a int(Link to C Faq Relevant's section).

Una referencia a &var es un puntero a una matriz de 10 ints.

Su declaración int (*ptr) [10] crea justamente un puntero a un array de 10 enteros a los que se asigna &var (la dirección de un puntero a un array de 10 enteros) (Link to C Faq Relevant's section).

Con estas cosas, con suerte, ptr imprimiría la dirección base del puntero en la matriz de 10 ints.

*ptr entonces imprimir la dirección del primer elemento de de la matriz de 10 ints.

Ambos en este caso son iguales y es por eso que ve la misma dirección.

Y sí, **ptr would give you 1.

+0

por supuesto, imprimiría estos correctamente si sigue los consejos de litb. Use (void *) y% p al imprimir direcciones. –

-1

supongo que esto podría aportar más claridad:

(sólo estoy usando un fragmento de código para reducir el desorden)

Declaración:

int a[5]; 
a[5] = {0,1,2,3,4); 

Indirection

ptr = a <======> ptr = &a[0] 

Desreferenciar

*ptr = *a <======> *ptr = *&a[0] 
        *ptr = a[0] 

, por lo tanto, podemos escribir:

*(ptr + i) = *(a + i) <======> *(ptr + i) = a[i] 

NOTA: '< =====>' es sólo un signo de 'implica '. ¡¡¡Nada especial!!! Espero no estar equivocado ??

Cuestiones relacionadas