Aprendizaje del lenguaje C: la diferencia entre los punteros de matriz y las matrices de punteros

1. Definición de puntero de matriz y matriz de punteros

1. Puntero de matriz: defina int (*p)[n],
ya que () tiene una prioridad alta, primero explique que p es un puntero de tipo int, que apunta a una matriz unidimensional de enteros (int), este uno- matriz dimensional La longitud de es n, también se puede decir que hay n cuadrículas en total. Los punteros de matriz también se denominan punteros a matrices unidimensionales, también conocidos como punteros de fila.
El puntero de matriz también se puede llamar "puntero de matriz". En primer lugar, esta variable es un puntero. En segundo lugar, "matriz" modifica este puntero, lo que significa que este puntero almacena la primera dirección de una matriz, o que este puntero apunta a la primera dirección de una matriz.dirección.

2. Matriz de punteros: defina int *p[n];
se puede decir que la matriz de punteros es una "matriz de punteros". Dado que *p no tiene corchetes, en primer lugar, esta variable es una matriz y, en segundo lugar, "apuntador p" modifica esta matriz, lo que significa que se dice que todos los elementos de esta matriz son de tipo puntero, y la cantidad de bytes que ocupa el puntero no tiene nada que ver con su tipo, sino solo con el sistema.En un sistema de 32 bits, cualquier tipo de puntero ocupa 4 bytes, bajo un sistema de 64 bits, cualquier tipo de puntero ocupa 8 bytes.


En segundo lugar, el uso de punteros de matriz y matrices de punteros

1. Puntero de matriz
Primero defina un puntero de matriz. Dado que es un puntero de matriz, significa que el puntero p se usa para apuntar a una matriz unidimensional, a saber:

int (*p)[[4]];
//El tipo int se define aquí, p es un puntero que apunta a la primera dirección de una matriz unidimensional, y el tamaño de esta matriz unidimensional es 4

Es decir, el puntero p de tipo int apunta al arreglo de int [[4]], y cada elemento del arreglo es una variable de tipo int.

La esencia de un puntero de matriz es un puntero, y la función de un puntero es apuntar a la dirección de una variable, por lo que un puntero de matriz generalmente se puede usar así (ejemplo):

void fun(int (*P)[4]); //parámetro en la subfunción, puntero de matriz 


a[3][4] = {0}; //La matriz bidimensional fun(a) definida en la función principal ; //El parámetro real de la función principal que llama a la subfunción es la dirección del primer elemento de la matriz bidimensional

void fun(int (*P)[4]); //子函数中的形参,数组指针 

a[3][4] = {0}; //主函数中定义的二维数组
fun(a); //主函数调用子函数的实参,是二维数组的首元素首地址


2. Matriz de punteros
Para una matriz de punteros, es decir, "matriz de punteros", significa que todos los elementos de esta matriz son de tipo puntero. Definamos un puntero p, por ejemplo:

int *p[[4]];
//aquí la longitud de la matriz es 4, todos los elementos son punteros de tipo int

El código es el siguiente (ejemplo):

void Fun(char** str);    //子函数中的形参,指针数组

int main()
{
	int arr[3][4];
	char* str = "abc";
	char** q = &str;
}


Matriz de punteros y problema de transferencia de parámetros de punteros de matriz
Los parámetros pasados ​​coinciden con los parámetros formales requeridos 

parámetros pasados Haga coincidir los parámetros requeridos
entero *p[4] int **p (matriz de punteros o puntero secundario)
entero (*p)[4] int (*p)[4] (sin cambios)
entero [3][4] int (*p)[4] (puntero de matriz)
int ** p int **p (sin cambios)


3. Ejemplos de uso real

Ejemplo: use una matriz de punteros para imprimir: "sun wu kong"

// 代码块  打印“sun wu kong”
char str1[] = { 's', 'u', 'n' , '\0' };
char str2[] = { 'w', 'u' ,'\0' };
char str3[] = { 'k', 'o', 'n', 'g' ,'\0' };
char* p[3] = { str1, str2, str3 };

Resumir

Sugerencia: aquí hay un resumen del artículo:
1. El puntero de matriz se entiende simplemente como "puntero de matriz". En primer lugar, esta variable es un puntero. En segundo lugar, "matriz" modifica este puntero, lo que significa que este puntero almacena la primera dirección de una matriz En otras palabras, este puntero apunta a la primera dirección de una matriz.
2. Una matriz de punteros se entiende simplemente como una "matriz de punteros". Primero, esta variable es una matriz, y segundo, "puntero p" modifica esta matriz, lo que significa que todos los elementos de esta matriz son tipos de puntero.
3. Preguntas sobre el paso de parámetros de función: Parámetros pasados: int *p[4] -> Parámetros formales requeridos para la coincidencia: int **p (matriz de punteros o puntero secundario);parámetros pasados: int (*p)[ 4] -> Parámetros formales necesarios para la coincidencia: int (*p)[4] (sin cambios).
 

 

Supongo que te gusta

Origin blog.csdn.net/qq_40999917/article/details/128336734
Recomendado
Clasificación