数组指针和指针数组
指针数组
int *arr1[10];
int **arr3[5];
本质上是数组,只不过是数组中存储的是指针。
数组指针
int(*arr4)[10];
本质上是指针,是能够指向数组的指针。使用方法,直接上代码。
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和print_arr2是两种数组指针的使用的方法。
分析代码意思
int main()
{
//数组
int arr[5];
//指针数组
int *parr1[10];
//数组指针
int(*parr2)[10];
//指针数组的数组 数组中存放10个指针,这10个指针指向10个数组,这10个数组每个数组的大小是5
int(*parr3[10])[5];
return 0;
}
&数组名VS数组名
直接上代码
int main()
{
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", &arr);
return 0;
}
通过代码运行的结果,我们好像很难发现区别,但实际上两个表达的含义是不一样的,通过下面的代码可以验证。
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;
}
我们通过观察运行结果发现,当给两个都加上1时,表示的结果就不一样了,数组名得到的是数组首元素的地址,加一时,加数据类型个大小,&数组名得到的时数组的地址,加一时,加数组个大小,因为数组一共10个元素,每个元素是4个字节,因此加了40个字节的大小。