Lenguaje C: puntero avanzado de 3 matrices

Definición del puntero de matriz

analogía:

Puntero de entero : puntero a entero

int a = 10;
int* pa = &a;

Puntero de carácter: puntero a un carácter

char ch = 'a';
char* pc = &ch;

Puntero de matriz: puntero a una matriz

int arr[10] = { 0 };
int(*p)[10] = &arr; // 数组指针

Diferencia : matriz de punteros y puntero de matriz

int(*p1)[10]; // 数组指针
int* p2[10];  // 指针数组

p1 se combina primero con *, lo que indica que p es una variable de puntero, que apunta a una matriz de tamaño 10 enteros, todo p1 es un puntero, que apunta a una matriz, p1 es un puntero de matriz.

p2 es una matriz con 10 elementos, que almacena el tipo int*, y p2 es una matriz de punteros.

Nota: [ ] tiene mayor prioridad que * y () debe usarse para combinar p1 y * primero.

nombre de la matriz y & nombre de la matriz

En la mayoría de los casos, el nombre de la matriz es la dirección del primer elemento de la matriz, pero existen dos excepciones:

1 y nombre de la matriz, el nombre de la matriz representa la matriz completa

2 sizeof (nombre de la matriz), el nombre de la matriz representa la matriz completa y se calcula el tamaño de la matriz completa.

int arreglo[10];

Para la matriz anterior, ¿qué significan arr y &arr?

Sabemos que arr es un nombre de matriz, y el nombre de la matriz representa la dirección del primer elemento. Si &arr es lo mismo que arr, primero mire el siguiente código.

int main()
{
	int arr[10] = { 0 };
	printf("arr = %p\n", arr);
	printf("&arr= %p\n", &arr);

	return 0;
}

resultado de la operación:

Se puede ver que &arr y arr imprimen la misma dirección, entonces, ¿representa la dirección del primer elemento de la matriz como arr? Mira el siguiente código:

int main()
{
	int arr[10] = { 0 };
	printf("arr = %p\n", arr);
	printf("&arr= %p\n", &arr);
	printf("arr+1 = %p\n", arr + 1);
	printf("&arr+1= %p\n", &arr + 1);

	return 0;
}

resultado de la operación:

Se puede encontrar que aunque &arr y arr tienen el mismo valor, sus significados deberían ser diferentes. De hecho, &arr representa la dirección de toda la matriz . En este ejemplo, el tipo de &arr es int(*)[10], que es el tipo de puntero de la matriz. &arr+1 compensa el tamaño de toda la matriz en 40 (la dirección impresa está en hexadecimal) y arr+1 lo compensa en un tamaño entero.

Por lo tanto, aunque los valores del nombre de la matriz y el nombre de la matriz son los mismos, sus significados no son los mismos, se puede entender que uno es la dirección del primer elemento de la matriz y el otro es la primera dirección de la matriz. La esencia es que sus tipos son diferentes, uno es un puntero del mismo tipo y el otro es un puntero de matriz.

Ahora que comprende los conceptos de punteros de matriz y nombres de matriz, echemos un vistazo a cómo se ve el tipo de puntero de matriz (puntero):

int* arr[10]; // (整型)指针数组
int* (*p)[10] = &arr; // (整型指针)数组指针

Uso de punteros de matriz

Introducción: acceso por puntero a matrices unidimensionales

Sabemos que se puede acceder a las matrices mediante subíndices o punteros, de la siguiente manera:

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	// 下标访问数组
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	// 指针访问数组
	int* p = arr;
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));//*(p+i)与p[i]等价
	}

	return 0;
}

resultado de la operación:

Acceso del puntero de matriz a una matriz bidimensional

    int arreglo[3][3] = { 1,2,3,4,5,6,7,8,9 };

Acceda a matrices bidimensionales mediante subíndices:

int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}

	return 0;
}

resultado de la operación:

arr[i] es en realidad la dirección del primer elemento de cada fila de la matriz, arr[i][j] es equivalente a *(arr[i]+j). Para una matriz bidimensional, su primer elemento es la primera fila de la matriz y su nombre de matriz es la dirección de la primera fila de la matriz, que es un puntero de matriz. De manera similar a usar un puntero para acceder a una matriz unidimensional, podemos definir un puntero de matriz para acceder a una matriz bidimensional, pero este no es el uso real del puntero de matriz.

Uno de los usos principales de los punteros de matriz es recibir una matriz bidimensional como parámetro, por ejemplo:

void print_arr(int(*arr)[3], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
int main()
{
    int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	print_arr(arr, 3, 3);

    return 0;
}

resultado de la operación:

Comprender los nombres de matrices bidimensionales:

De hecho, la esencia de pasar parámetros de matriz bidimensional (int arr [][3]) es pasar un puntero de matriz, que es el nombre de la matriz de una matriz bidimensional. El paso de parámetros de matriz y el paso de parámetros de puntero se explicarán en profundidad en el próximo artículo.

Continúe aprendiendo contenido de puntero avanzado; consulte el siguiente artículo: Parámetros de matriz/Parámetros de puntero

Supongo que te gusta

Origin blog.csdn.net/2301_79391308/article/details/132995096
Recomendado
Clasificación