2012-02-16 17 views
6

tengo el siguiente código:Cómo usar "puntero a la matriz 10 de 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; 
} 

de salida:

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

Aquí he tomado a como puntero a la matriz 10 de int que apunta a la matriz b, por lo que ahora qué ¿No puedo obtener el valor de 32 en a[2]?

a[2] se evalúa como *(a+2) por lo que ahora el tiene la dirección de la matriz de modo b*(b+2)*(a+2) y son similares así que ¿por qué no recibo valor de 32 aquí?


Editar: me dieron respuesta mediante el uso de

(*a)[2] 

pero no estoy recibiendo cómo funciona ... ver cuando

a[2] es *(a+2) y a+2 es una más 2 * sizeof(int[10]) bytes.

de esta manera (*a)[2] cómo expandir?

+0

(* a) [2] sería lo mismo que [0] [2] – novice

Respuesta

6

Según las reglas de la aritmética de punteros, a[2] es *(a+2) y a+2 es a plus 2 * sizeof(int[10]) bytes.

(pensar en una ordinaria int *p;. p+1 es p más sizeof(int) bytes y (char *)(p + 1) es diferente de (char *)p + 1 Ahora reemplazar int con int[10])

+0

oyh esto es lo que no me entendieron ... !! gracias –

+0

Funcionaría usando ((int *) a) [2] – Eregrith

+0

@Eregrith: Creo que eso violaría la regla de aliasing estricta y causaría un comportamiento indefinido. –

7

Desde a ya es un puntero, tiene que eliminar la referencia con el fin de hacer referencia a la matriz que apunte a:

(*a)[2] 
+0

Esto se llama "sustitución de una sola línea" :) –

-1

int b [10] == int* que apunta al primer valor de la array

int (* a) [10] == int** que apuntan a la dirección de un puntero que apunta a un array

a+2 == (&b)+2

Espero que esto aclare las cosas para que

+0

Esto está mal. 'b' no es' int * ',' a' no es 'int **', y 'int * a [10]' es diferente de 'int (* a) [10]'. – interjay

+0

@interjay Sí, la forma en que lo escribí primero me produciría una matriz de 10 int *. Pero 'b' es un' int * ' – Djole

+0

No,' b' no es un 'int *', pero puede decaer a 'int *' en algunos contextos (no en todos). Sin embargo, 'a' nunca decaerá a' int ** 'porque se comportan de forma completamente diferente. Y su línea sobre 'a' que apunta a la dirección de un puntero también está mal. – 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; 
} 

Esto imprime el siguiente:

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

¿Ves lo que está pasando? magic menos a equivale a 80, es decir, 4 * 10 * 2. Esto es porque a es un puntero a una matriz de diez enteros, por lo que sizeof(*a) == 10 * sizeof(int) y no sizeof(a) == sizeof(int), que es lo que esperaba. ¡Preste atención a los tipos en la aritmética del puntero la próxima vez!

+0

sí lo tengo ... gracias .. !!! –

0

No pude agregar un comentario aquí porque requiere 50 reputación. Así que aquí va mi pregunta para la pregunta publicada. Lo siento si voy a violar algunas de las reglas al publicar la pregunta en el cuadro de respuesta. Esta pregunta muestra que debemos tener cuidado al realizar la aritmética del puntero. Pero, ¿cuál es el buen uso del uso de punteros a una matriz si lo mismo se puede hacer simplemente usando punteros a enteros ....?

Cuestiones relacionadas