Sobre la diferencia entre la matriz de punteros y el puntero de matriz en el lenguaje Go

Ya le he presentado el uso de punteros en detalle, entonces, ¿cuál es el cambio entre la llamada matriz de punteros y el puntero de matriz, y cuál es la conexión entre ellos? Ya sea que signifique un significado o diferentes significados, hablemos de ello a continuación.

Matriz de punteros

En primer lugar, 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 puntero siempre ocupa 4 bytes. . Es la abreviatura de "matriz de punteros".

Puntero de matriz

Primero, 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".

Cuando el puntero está en la parte posterior, significa que es un puntero, solo apunta a una matriz;
cuando el puntero está en el frente, es una matriz, pero los elementos de la matriz son todos punteros.
Entonces todos deberían poder entender de lo que estoy hablando.

definición

Definición de puntero de matriz (también llamado puntero de fila)

int (*p)[n]

() La prioridad es alta. Primero, p es un puntero que apunta 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.

//定义二维数组
 int a[3][4];

//该语句是定义一个数组指针,指向含4个元素的一维数组。
 int (*p)[4]; 
      
//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
 p=a;  
    
//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
 p++;   

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

En la matriz bidimensional
, los cinco valores de a, & a, a [0], & a [0], & a [0] [0] son ​​iguales y todos apuntan a la primera dirección (posición inicial) de la matriz bidimensional. La
diferencia radica en estos cinco Los tipos de expresiones son diferentes, tome int a [2] [3] por ejemplo:

a es el nombre de la matriz bidimensional, que es una constante y almacena la primera dirección de la matriz bidimensional. El tipo es una matriz bidimensional, tamaño de (a) = 24

& a La (primera) dirección de la matriz bidimensional a, que a su vez es un puntero, sizeof (& a) = 4, el tipo de puntero es 4

a [0] apunta a la primera fila de la matriz bidimensional a [0] [], el tipo es una matriz unidimensional sizeof (a [0]) = 12
& a [0] representa la dirección de a [0], y unidimensional El nombre de la matriz a [0] tiene el mismo valor, pero es un tipo de puntero sizeof (& a [0]) = 4
& a [0] [0] representa la dirección del primer elemento en una matriz bidimensional, y el tipo de puntero sizeof (& a [0] [0]) = 4

Definición de matriz de 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 se ejecuta p + 1 aquí, p apunta al siguiente elemento de la matriz.

La siguiente asignación es incorrecta:

p = a;

Debido a que p es una representación incognoscible, solo existen p [0], p [1], p [2] ... p [n-1], y son variables de puntero que se pueden usar para almacenar direcciones de variables.
Pero se puede asignar de la siguiente manera:

* p = a;

Aquí * p representa el valor del primer elemento de la matriz de punteros, que es 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++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]

Aquí int * p [3] significa que hay tres variables de puntero almacenadas en una matriz unidimensional, que son p [0], p [1], p [2]; por lo tanto, asigne valores por separado.

El puntero de matriz es solo una variable de puntero. Parece que se usa específicamente para apuntar a una matriz bidimensional en el lenguaje C. Ocupa el espacio de almacenamiento de un puntero en la memoria.

La matriz de punteros es una serie de variables de puntero, almacenadas en la memoria en forma de matriz, que ocupan el espacio de almacenamiento de varios 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]

Prioridad: ()> []> *

Juzgue la matriz de punteros y el puntero de matriz según la prioridad

¿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];

Antes de eso, debe comprender la prioridad de un símbolo.

Primero analice la prioridad de "[]" en A) que "*".
p1 se combina primero con "[]" para formar la definición de una matriz, el nombre de la matriz es p1, int * modifica el contenido de la matriz, es decir, cada elemento de la matriz. Entonces ahora podemos entender que se trata de una matriz, que contiene 10 punteros a datos de tipo int, es decir, una matriz de punteros.

Reanálisis B) "()" tiene una prioridad más alta que "[]".
El signo "*" y p2 constituyen la definición de un puntero. La variable de puntero se llama p2. Int modifica el contenido de la matriz, es decir, cada elemento de la matriz. La matriz no tiene un nombre aquí, es una matriz anónima.
Ahora sabemos que p2 es un puntero, que apunta a una matriz que contiene 10 datos int, es decir, un puntero de matriz.

Como se muestra abajo:
Inserte la descripción de la imagen aquí

Sobre la diferencia entre ay & a

Para ilustrar la diferencia entre ay & a, el código es el siguiente:

int main()
{
    
    
   char a[5]={
    
    'A','B','C','D'};
   char (*p3)[5] = &a;
   char (*p4)[5] = a;
   return 0;
}

¿Cuál será el valor de p3 + 1? ¿Cuál será el valor de p4 + 1? No hay duda de que p3 y p4 son punteros de matriz, apuntando a toda la matriz.
& a es la primera dirección de toda la matriz;
a es la primera dirección del primer elemento de la matriz .

El valor es el mismo pero el significado es completamente diferente.
En lenguaje C, los tipos de datos en ambos lados del símbolo de asignación "=" deben ser iguales. Si son diferentes, se requiere una conversión de tipos explícita o implícita.

Los tipos de datos en ambos lados del "=" en la definición de p3 son exactamente los mismos, mientras que los tipos de datos en ambos lados del "=" en la definición de p4 son inconsistentes.
El tipo de la izquierda es un puntero a toda la matriz y el tipo de datos de la derecha es un puntero a un solo carácter.

Ahora que está claro que tanto p3 como p4 apuntan a toda la matriz, los valores de p3 + 1 y p4 + 1 son fáciles de entender.

¿Cuál es el problema si cambia la longitud de la matriz para que sea más pequeña? ¿Cuáles son los valores de p3 + 1 y p4 + 1?

int main()
{
    
    
   char a[5]={
    
    'A','B','C','D'};
   char (*p3)[3] = &a;
   char (*p4)[3] = a;
   return 0;
}

¿Cuál es el problema si se aumenta la longitud de la matriz?

int main()
{
    
    
   char a[5]={
    
    'A','B','C','D'};
   char (*p3)[10] = &a;
   char (*p4)[10] = a;
   return 0;
}

¿Cuáles son los valores de p3 + 1 y p4 + 1 en este momento?

Los resultados obtenidos:
(1) char (*p2)[5]=a;
Se debe utilizar una conversión forzada, como por ejemplo:

char (*p2)[5]=(char (*)[5])a;

(2). Si se cambia la longitud de la matriz, el mensaje de error indica que la compilación falla:

error C2440: 'initializing' : cannot convert from 'char (*)[5]' to 'char (*)[3]'

error C2440: 'initializing' : cannot convert from 'char (*)[5]' to 'char (*)[10]'

(3). Después de cambiar el programa anterior, el código para ejecutarse correctamente es el siguiente:

int main()

{
    
    

  	char a[5]={
    
    'a','b','c','d'};

  	char (*p1)[5]= &a;

  	char (*p2)[5]=(char (*)[5])a;


  	printf("a=%d\n",a);

  	printf("a=%c\n",a[0]);

  	printf("p1=%c\n",**p1);

  	printf("p2=%c\n",**p2);

  	printf("p1+1=%c\n",**(p1+1));

  	printf("p2+1=%c\n",**(p2+1));


  	return 0;

}

resultado de la operación:

a=1638208

a=a

p1=a

p2=a

p1+1=?

p2+1=?

Press any key to continue

Puede probar los resultados más tarde y ver qué obtiene.

En conclusión:

Según el tipo de puntero y el objeto al que apunta, indica el tamaño del puntero, y cada vez que aumenta en 1, significa que el tamaño del puntero aumenta en bytes.

Supongo que te gusta

Origin blog.csdn.net/zp17834994071/article/details/108716755
Recomendado
Clasificación