重庆建筑信息工程官网,深圳网站seo外包公司哪家好,网站规划与建设书,磁力吧最佳搜索引擎数组指针定义
类比#xff1a;
整型指针--指向整型的指针
int a 10;
int* pa a;
字符指针--指向字符的指针
char ch a;
char* pc ch;
数组指针--指向数组的指针
int arr[10] { 0 };
int(*p)[10] arr; // 数组指针
区分#xff1a;指针数组和数组…数组指针定义
类比
整型指针--指向整型的指针
int a 10;
int* pa a;
字符指针--指向字符的指针
char ch a;
char* pc ch;
数组指针--指向数组的指针
int arr[10] { 0 };
int(*p)[10] arr; // 数组指针
区分指针数组和数组指针
int(*p1)[10]; // 数组指针
int* p2[10]; // 指针数组
p1先和*结合说明p是一个指针变量指向的是一个大小为10个整型的数组所有p1是一个指针指向一个数组p1是数组指针。
p2是一个数组有10个元素存放int*类型p2是指针数组。
注[ ]优先级高于 * 必须使用 () 使p1与 * 先结合。
数组名和数组名
数组名绝大多数情况下是数组首元素地址但是有两个例外 1 数组名数组名表示整个数组 2 sizeof(数组名数组名表示整个数组计算的是整个数组的大小。 int arr[10]; 对于上面的数组arr和arr分别是什么意思
我们知道arr是数组名数组名表示首元素的地址arr是否和arr相同先看下面这段代码。
int main()
{int arr[10] { 0 };printf(arr %p\n, arr);printf(arr %p\n, arr);return 0;
}
运行结果 可见arr和arr打印的地址一样那么它是否和arr一样表示的是数组首元素地址呢在看下面这段代码
int main()
{int arr[10] { 0 };printf(arr %p\n, arr);printf(arr %p\n, arr);printf(arr1 %p\n, arr 1);printf(arr1 %p\n, arr 1);return 0;
}
运行结果 可以发现arr和arr虽然值一样但它们的意义应该不一样。事实上arr表示的是整个数组的地址在本例中arr的类型是int(*)[10]即数组指针类型。arr1偏移了整个数组的大小40打印的地址为十六进制arr1则偏移了一个整型大小。
所以数组名和数组名的值虽然相同但是它们的意义并不相同可以理解为一个是数组首元素地址另一个是数组首地址本质是它们的类型不同一个是同类型指针另一个则是数组指针。
理解了数组指针和数组名的概念在来看一下指针数组指针类型是什么样的
int* arr[10]; // 整型指针数组
int* (*p)[10] arr; // 整型指针数组指针 数组指针的使用
引入--指针访问一维数组
我们知道可以通过下标或指针访问数组如下
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));//*(pi)与p[i]等价}return 0;
}
运行结果 数组指针访问二维数组 int arr[3][3] { 1,2,3,4,5,6,7,8,9 }; 通过下标访问二维数组
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;
}
运行结果 arr[i]其实是数组每一行首元素的地址arr[i][j]等价*(arr[i]j)。对于二维数组它的首元素是数组第一行它的数组名就是数组第一行的地址是一个数组指针。与用指针访问一维数组类似我们可以定义一个数组指针用来访问二维数组但这并不是数组指针的真实用途。
数组指针的一个主要用法是作为参数接收二维数组例如
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;
}
运行结果 理解二维数组名 事实上二维数组传参int arr[][3]的本质就是传递一个数组指针即二维数组的数组名。关于数组传参和指针传参将在下篇深入讲解。 继续学习指针进阶内容见下篇数组参数/指针参数