提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
区别 “数组指针” 和 “指针数组”,我们只需要看后两个字是指针就是指针,是数组就是数组。
一、指针数组
指针数组:就是用来存地址的数组。
例如:int *arry[3]; 表示arry是一个包含3个元素的数组,每一个元素都是一个指向整数的指针。
//示例
int a = 10;
int b = 20;
int c = 30;
int *arry[3];
arry[0] = &a; // arry[0] 现在指向 a
arry[1] = &b; // arry[1] 现在指向 b
arry[2] = &c; // arry[2] 现在指向 c
//*arry[0]整数a的值。
二、数组指针
数组指针:就是指向数组的指针。
例如,int (*array_ptr)[Size]; 表示声明了一个指向整型数组的指针,float (*array_ptr)[Size]; 表示声明了一个指向浮点型数组的指针,Size是数组的大小。注意这是数组指针声明的规定写法。
数组指针和其他指针一样也是存的元素的首地址,只不过数组指针存的是整个一维数组的首地址,其跨度为整个数组,而int型指针存的是int类型变量的首地址,跨度为4个字节,依次类推。
- 数组指针操作一维数组
//示例
#include <stdio.h>
int main() {
int arr1[3] = {1, 2, 3};
int arr2[3] = {4, 5, 6};
int (*array_ptr)[3] = &arr1; // 使用&arr1来获取arr1的地址
/* 注意!尽管 打印arr1和&arr1都是一样的地址,
但arr1表示首元素的首地址,
&arr1表示整个数组的首地址
*/
printf("%d\n", (*array_ptr)[1]); // 输出 arry 的第二个元素,即 2
array_ptr = &arr2; // array_ptr重新指向arr2的地址
printf("%d\n", (*array_ptr)[1]); // 输出 arr2 的第二个元素,即 5
return 0;
}
由于 array_ptr 已经指向了整个数组,所以 *array_ptr 就代表了 数组本身。
- 数组指针操作二维数组
//示例
#include <stdio.h>
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
//定义数组指针,指向二维数组的第一行(将二维数组降维后,其每一行就是一个一维数组的元素)
int (*ptr)[4]=arr;
printf("%d\n", **ptr); //[0][0]的值,*ptr实质上将ptr降维成了一个整型指针,那么**ptr就是其指向的值
pprintf("%d\n", *((*ptr)+1)); //[0][1]的值
printf("%d\n", *(*(ptr+1)));//[1][0]的值,ptr+1将跨过整个一维数组(一行),同样*(ptr+1)也可以理解为一个整型指针,*(*(ptr+1)))就是其指向的值
return 0;
}
下面再来看这个
#include <stdio.h>
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 定义一个整型指针ptr 指向 arr 的第2行(即 arr[1])的第一个元素
int *ptr = arr[1]; //事实上,arr[1]就是一个一维数组(第二行)的数组名,因此其指向第二行的首元素
for(int i=0;i<8;i++)
{// 由于二维数组连续存储,使用 ptr以访问一维数组的形式 来访问从第二行开始的每个元素
printf("%d\n", ptr[i]);
}
return 0;
}
以上程序只是举例帮助理解,实际不推荐这样编写
另外数组名表示首元素的(首)地址,对于一维数组int a[3]={1,2,3} ,a即为元素1的地址,实质是一个整型指针。
对于二维数组 int aa[3][2]={{1,2},{3,4},{5,6}},aa即为首元素{1,2}这个一维数组的地址 ,实质是个数组指针。
总结
一维数组:int arr[i]
&arr:整个数组的地址,赋给数组指针,
arr:数组首元素的地址 ,赋给整型指针
&arr[i]:数组第i个元素的地址,赋给整型指针
arr[i]:第i个元素的值
二维数组:int arr[i][j]
arr:首元素(第一行)的地址,数组指针
arr[i]:第i行首元素的地址,整型指针
&arr[i][j]:第i行j列处元素的地址 ,整型指针
arr[i][j]:第i行j列处元素的值