Directorio de artículos
Puntero de matriz y matriz de puntero
Matriz de punteros
int *arr1[10];
int **arr3[5];
Es esencialmente una matriz, pero los punteros se almacenan en la matriz.
Puntero de matriz
int(*arr4)[10];
Esencialmente un puntero, un puntero que puede apuntar a una matriz. Cómo usarlo, directamente en el código.
void print_arr1(int arr[3][5], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void print_arr2(int (*arr)[5], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
print_arr1(arr, 3, 5);
print_arr2(arr, 3, 5);
return 0;
}
Print_arr1 y print_arr2 son dos métodos para usar punteros de matriz.
Analizar el significado del código
int main()
{
//数组
int arr[5];
//指针数组
int *parr1[10];
//数组指针
int(*parr2)[10];
//指针数组的数组 数组中存放10个指针,这10个指针指向10个数组,这10个数组每个数组的大小是5
int(*parr3[10])[5];
return 0;
}
& Nombre de matriz VS nombre de matriz
Codificar directamente
int main()
{
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", &arr);
return 0;
}
A través de los resultados de la ejecución del código, parece difícil para nosotros encontrar la diferencia, pero de hecho el significado de las dos expresiones es diferente, lo que se puede verificar con el siguiente código.
int main()
{
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", &arr);
printf("%p\n", arr + 1);
printf("%p\n", &arr + 1);
return 0;
}
Al observar los resultados de la ejecución, encontramos que al agregar 1 a ambos, el resultado es diferente. El nombre de la matriz obtiene la dirección del primer elemento de la matriz. Cuando se agrega uno, se agrega el tamaño del tipo de datos y el el resultado se obtiene mediante & nombre de la matriz Al agregar una a la dirección de la matriz, sume el tamaño de la matriz Debido a que la matriz tiene 10 elementos en total, cada elemento tiene 4 bytes, por lo que se agregan 40 bytes.