(5) Puntero de matriz y matriz de puntero

Puntero de matriz (también llamado puntero de fila)

Puntero de matriz, literalmente significa "puntero a matriz".

定义 int (*p)[n];

() La prioridad es alta. Primero, p es un puntero a una matriz unidimensional entera. La longitud de esta matriz unidimensional es n, que también se puede decir que es el tamaño de paso de p. Es decir, cuando se ejecuta p + 1, p tiene que abarcar la longitud de n datos enteros.

Si desea asignar una matriz bidimensional a un puntero, debe asignarlo así:
int a [3] [4];
int (* p) [4]; // Esta declaración es para definir un puntero de matriz, apuntando a un puntero con 4 elementos Matriz dimensional.
p = a; // Asignar la primera dirección de la matriz bidimensional ap, es decir, a [0] o & a [0] [0]
p ++; // Después de que se ejecuta la sentencia, es decir, p = p +1; p Cruzando la línea a [0] [] apunta a la línea a [1] []

Por lo tanto, los punteros de matriz también se denominan punteros a matrices unidimensionales o punteros de fila.

Matriz de punteros

Una matriz de punteros, literalmente, es una matriz cuyos elementos son punteros.

定义 int *p[n];

[] Alta prioridad, primero se combina con p para formar una matriz, y luego int * muestra que se trata de una matriz de punteros enteros, que tiene n elementos de matriz de tipo puntero. Cuando p + 1 se ejecuta aquí, p apunta al siguiente elemento de la matriz, por lo que la asignación es incorrecta: p = a; debido a que p es una representación incognoscible, solo p [0], p [1], p [2] .. .p [n-1], y son variables de puntero que se pueden usar para almacenar direcciones de variables. Pero puede ser así p = a; donde p representa el valor del primer elemento de la matriz de punteros y el valor de la primera dirección de a.
Para asignar una matriz bidimensional a una matriz de punteros:
int * p [3];
int a [3] [4];
p ++; // Esta declaración indica que la matriz p apunta al siguiente elemento de la matriz. Nota: Cada elemento de esta matriz es un puntero
para (i = 0; i <3; i ++)
p [i] = a [i]
donde int * p [3] significa que hay tres punteros almacenados en un array Las variables son p [0], p [1], p [2],
por lo que deben asignarse por separado.

De esta manera, la diferencia entre los dos es repentinamente clara. El puntero de matriz es solo una variable de puntero, que parece usarse específicamente para apuntar a una matriz bidimensional en el lenguaje C, y ocupa el espacio de almacenamiento de un puntero en la memoria. La matriz de punteros es una pluralidad de variables de puntero, que se almacenan en la memoria en forma de matriz, ocupando el espacio de almacenamiento de múltiples punteros.
Otro punto que debe explicarse es que cuando se usa para apuntar a una matriz bidimensional al mismo tiempo, la referencia es la misma que la referencia por el nombre de la matriz.
Por ejemplo, para representar un elemento en la fila i y la columna j en la matriz:

*(p[i]+j)*(*(p+i)+j)(*(p+i))[j]、p[i][j]

优先级:()>[]>*

Disposición de memoria de matrices de punteros y punteros de matriz

Matriz de punteros : primero, es una matriz. Los elementos de la matriz son punteros. La cantidad de bytes que ocupa la matriz está determinada por el tamaño de la matriz en sí. Cada elemento es un puntero. En un sistema de 32 bits, cualquier tipo de el puntero siempre ocupa 4 bytes. Es la abreviatura de "matriz de punteros".
Puntero de matriz : en primer lugar, es un puntero que apunta a una matriz. En un sistema de 32 bits, cualquier tipo de puntero siempre ocupa 4 bytes. En cuanto a cuántos bytes apunta la matriz, no lo sé, depende del tamaño de la matriz. Es la abreviatura de "puntero a matriz".

¿Cuál de los siguientes es un puntero de matriz y cuál es una matriz de punteros?

A)
int *p1[10];
B)
int (*p2)[10];
  • "[]" tiene una prioridad más alta que "*". p1 se combina primero con "[]" para formar la definición de una matriz. El nombre de la matriz es p1, e int * modifica el contenido de la matriz, es decir, cada elemento de la matriz. Entonces ahora sabemos que se trata de una matriz, que contiene 10 punteros a datos de tipo int, es decir, una matriz de punteros.

  • En cuanto a p2, es mejor entender. Aquí, la prioridad de "()" es mayor que la de "[]". El signo "*" y p2 constituyen la definición de un puntero. La variable de puntero se llama p2, e int modifica el contenido de la matriz, es decir, cada elemento de la matriz. La matriz no tiene nombre aquí, es una matriz anónima. Entonces, ahora sabemos que p2 es un puntero, apunta a una matriz que contiene 10 datos de tipo int, es decir, un puntero de matriz. Podemos utilizar el siguiente diagrama para profundizar nuestra comprensión:
    Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_40329851/article/details/114298016
Recomendado
Clasificación