数组指针是一个非常重要的概念,在计算机科学中有广泛的应用。数组指针既可以看作是数组的指针类型,也可以看作是指针的数组类型。本文将围绕数组指针展开探讨,深入理解数组指针,解析指针与数组之间的关系。
1. 数组指针的定义
数组指针是指一个指向数组的指针变量。数组指针既可以指向一维数组,也可以指向二维、三维等多维数组。因此,数组指针的类型也可以是一维、二维、三维等多种类型。下面是几种数组指针的定义:
```c
int array[5] = {1, 2, 3, 4, 5};
int *p1 = array; //指向一维数组的指针
int (*p2)[5] = &array; //指向一维数组的指针,指向整个数组
int arr[2][3] = {{1,2,3},{4,5,6}};
int (*p3)[3] = arr; //指向二维数组的指针,指向整个数组
```
2. 数组指针与指针数组的区别
在数组指针的定义中,提到了数组指针可以看作是指针的数组类型。那么,指针数组又是什么呢?指针数组是由若干个指针元素组成的数组,每个指针元素指向一个变量或者数组。指针数组的类型是由指针元素的类型组成的。
数组指针和指针数组的区别在于,数组指针是指向数组的指针变量,而指针数组是由若干个指针元素组成的数组。下面是几个指针数组的定义:
```c
int i1 = 1, i2 = 2, i3 = 3;
int *pArr[3] = {&i1, &i2, &i3}; //指针数组,每个元素为int*
int (*arrP)[3]; //数组指针,指向整个二维数组
int arr[2][3] = {{1,2,3},{4,5,6}};
arrP = arr; //数组指针指向整个二维数组
```
3. 数组指针的常用操作
3.1 数组指针与指针的关系
对于一个数组arr[5],它的第一个元素的地址可以通过arr获取,也可以通过&arr[0]获取;第二个元素的地址可以通过arr+1获取,也可以通过&arr[1]获取。因此,可以使用指针来遍历数组中的元素。下面是一个例子:
```c
int array[5] = {1, 2, 3, 4, 5};
int *p = array; //指向数组的指针
for(int i=0; i<5; ++i)
{
printf("%d ", *(p+i)); //使用指针遍历数组元素
}
```
3.2 多维数组指针
对于多维数组,可以定义一个多维数组指针来遍历数组中的元素。下面是一个二维数组的例子:
```c
int arr[2][3] = {{1,2,3},{4,5,6}};
int (*p)[3] = arr; //指向二维数组的指针
for(int i=0; i<2; ++i)
{
for(int j=0; j<3; ++j)
{
printf("%d", *(*(p+i)+j)); //使用指针遍历二维数组元素
}
printf(" ");
}
```
第一次循环i=0的时候,执行语句*(*(p+i)+j)时,等价于*(*(p+0)+j),即**p** 指向第0行第0列的数据,*(*(p+0)+1)* 指向第0行第1列的数据,…,*(*(p+0)+2)* 指向第0行第2列的数据。所以,第一次输出的结果是123。
3.3 指针位移
对于一个指向数组的指针变量p,p+1的值等于p+sizeof(一个数组元素的大小)。因此,可以用指针位移的方式来处理数组,而不用通过下标来访问数组元素。下面是一个例子:
```c
int array[5] = {1, 2, 3, 4, 5};
int *p = array;
while(p < array + 5) //使用指针位移的方式遍历数组
{
printf("%d ", *p);
++p;
}
```
4. 小结
通过本文的介绍,读者应该对数组指针有了更深入的理解。数组指针不仅可以指向一维数组,还可以指向二维、三维等多维数组。而指针数组是由若干个指针元素组成的数组,每个指针元素指向一个变量或者数组。对于数组指针,可以通过指针位移的方式来处理数组,而不用通过下标来访问数组元素。熟练掌握数组指针的使用,对于程序的开发和优化是非常有帮助的。