前言:
在了解指针数组和数组指针前,需要先了解2个知识点:
1、 数组:是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一段连续的内存空间中。
如 int arr[5] = {1, 2, 3, 4, 5};
数组arr里面共有5个元素,且每个元素都是int类型。
2、 C语言中的运算符优先级。如下表:
同时,还有几个容易出错的优先级判定:
. 的优先级高于 * 如 *p.c 实际上等价于 *(p.c)
[] 的优先级高于 * 如 int *p[] 实际等价于 int*(p[])
函数() 优先级高于 * 如 int *fun() 实际等价于 int* (fun())
正文:
1、 指针数组:
定义:若一个数组中的所有元素都是指针,那么我们就称它为指针数组,如:
int * arr[5] 由上述优先级可知, arr 先与[5]结合为 arr[5] ,即5个元素的数组,然后再和 int* 结合,即arr数组中每个元素都是 int* 类型。
一般形式:数据类型 *数组名[常量表达式][常量表达式]...... ;
例子:
2、 数组指针:
定义:数组指针是指一个指针,它指向一个数组的第一个元素。可以通过对指针进行加减操作来访问数组中的其他元素,如:
int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr;
ptr是一个指向整型数组的指针,它指向数组arr的首地址。&arr表示数组arr的地址,因为数组名本身就是一个指向数组首元素的指针。
一般形式:data_type (*pointer_name)[array_size],其中data_type是数组元素的数据类型,pointer_name是指针变量的名称,array_size是数组的大小。
例子:数组指针更多的应用于二维数组,如:
int a[4][3]={{1,2,3},{4,,5,6,},{7,8,9,},{10,11,12}};//定义一个二位数组,4行3列
int (*p)[3] = a ;//定义一个数组指针,指向a,数组类型为int[3]
则对指针进行加减法时,前进和后退的步长与数组指针指向的数据类型有关。p指向的数据类型为int[3],则p+1是前进3*4=12个字节,p-1是后退3*4=12个字节,正好是数组a所包含的每个一维数组的长度,即p+1会让指针指向二维数组的下一行,p-1会让指针指向二维数组的上一行。
最后,希望各位看官可以点点赞,关注下,后面会不定期更新C语言相关知识点