Arreglos que se descomponen en punteros

Por favor, ayúdame a entender los progtwigs a continuación.

#include int main() { int a[7]; a[0] = 1976; a[1] = 1984; printf("memory location of a: %p", a); printf("value at memory location %p is %d", a, *a); printf("value at memory location %p is %d", &a[1], a[1]); return 0; } 

&a[1] y &a+1 . ¿Son iguales o diferentes?

 #include  int main() { int v[10]; int **p; int *a[5]; v[0] = 1234; v[1] = 5678; a[0] = v; a[1] = v+1; printf("%d\t%d\t%d\t%d\n", *a[0],*a[1],a[0][0],**a); printf("%d\n", sizeof(v)); return 0; } 

Quería saber cómo *a[5] está representado en la memoria. ¿Es *a un puntero de base que apunta a a[0],a[1],a[2],a[3],a[4] ?

 #include int main() { int v[10]; int **p; int (*a)[10]; a=&v; printf("%d\n",*a); return 0; } 

a=v; // gives error why? v aquí decae en *v . Entonces, ¿se descompone &v en (*)[]v ? & significa puntero const. Aquí, ¿cómo es posible establecer un puntero de const en un puntero de no const sin un encasillado?

¿Dónde se almacena la matriz en la memoria. ¿Se almacena en el segmento de datos de la memoria.

 #include int main() { int carray[5]={1,2,3,4,5}; printf("%d\n",carray[0]); printf("%d\t%d\t%d\n",sizeof(carray),sizeof(&carray),sizeof(&carray[0])); return 0; } 

EDITADO:

He revisado algunos de los artículos que indican que las dos únicas situaciones posibles en las que un nombre de matriz no puede ser escrito en el puntero es el sizeof y & . Pero en el progtwig anterior, sizeof(&carray) da el tamaño como 4. y &carray decae en (*)[]carray como su valor.

Luego, la statement de que el nombre de la matriz no se puede descomponer en punteros en dos condiciones sizeof y & vuelve falsa aquí.

&a[1] y &a+1 . ¿Son iguales o diferentes?

Diferente. &a[1] es lo mismo que (a+1) . En general, x[y] es por definición equivalente a *(x+y) .

Quería saber cómo *a[5] está representado en la memoria. Hace *a es un puntero de base que apunta a a[0],a[1],a[2],a[3],a[4] .

En su segundo ejemplo, a es una matriz de punteros. *a[i] es el valor del objeto, cuya dirección se almacena como el elemento i th en su matriz. *a en este caso es lo mismo que a[0] , que es el primer elemento de la matriz (que es un puntero).

a=v //why this gives error

Porque a (en su último ejemplo) es un puntero a una matriz. Desea asignar a a , entonces necesita asignar la dirección de la matriz v (o cualquier otra matriz con las dimensiones correctas);

 a = &v; 

Es muy bueno que te hayas comprometido a entender las cosas, pero nada te ayudará mejor que un buen libro de C.

Espero que esto ayude.

Las cosas que necesitarán saber al tratar con punteros son las siguientes:

 int *a and int a[] 

es una statement de un Array, la única diferencia es que en un [] tendrá que declarar su tamaño constante, * a le da flexibilidad, puede apuntar a un tamaño de array de 1 a infinito

 int *a[] and int **a 

es una statement de un Array of Array, a veces llamado Matrix, la única diferencia es que en * a [] tendrás que declarar cuántos Arrays a [] contendrán punteros de, ** a te da flexibilidad, puede apuntar a cualquier matriz de matrices a la que desea que se asigne.

EN GENERAL: Al agregar & a una variable, agrega un * a su definición de Tipo:

int a

& a -> & (int) = int *

al agregar * a una variable, se borra un * de su definición de Tipo

int * a;

* a -> * (int *) = int

 int *a; &a - the Address given to the pointer a by the system(pointer of pointer = **a) &a+1 - the Address to the beginning of the array + 1 byte &a[1] == &(a+1) - the Address to the beginning of the array + 1 size of int int **a; *a == a[0] - the Address of the first Array in the array of arrays a *a[0]==a[0][0] - the first int of first array int *a, b[5]; *a=*b - ERROR because a points at garbage to begin with a=b - a points at array b 

Pregúntame qué más quieres saber y editaré esta respuesta.

& a [1] y & a + 1. ¿Son iguales o diferentes?

No lo son, el primero se refiere al segundo entero en la matriz llamada a, el segundo se refiere a un entero construido a partir de los bytes sizeof (int) que comienzan en la ubicación de la memoria en un byte + 1.

Quería saber cómo se representa * a [5] en la memoria. El * a es un puntero de base que apunta a [0], a [1], a [2], a [3], a [4].

a es ahora el puntero a la ubicación del primer elemento en la matriz que declaró en la stack de tamaño 5. & a apunta a lo mismo que & a [0]; & a [1] apunta a & a + sizeof (int).

a = v; // da error por qué? aquí v decae en * v.

Esto le da un error porque a es un puntero a una matriz, mientras que v es una matriz. Por lo tanto, debe asignar la dirección de v (& v) a a.

aquí v decae en * v

Una matriz nunca decae a su primer elemento. Nunca. v puede decaer a &v[0] (que es lo mismo que &*v ) pero nunca a v[0] (o *v , que es lo mismo)