目录:
- 指针数组
- 数组指针
- 两者比较
-指针数组
我们类⽐⼀下,
整型数组,是存放整型的数组,
字符数组,是存放字符的数组。
那指针数组呢?是存放指针的数组。
指针数组的每个元素都是⽤来存放地址(指针)的。例如:
指针数组的每个元素是地址,⼜可以指向⼀块区域。
2.利用指针数组模拟⼆维数组
#include <stdio.h>
int main()
{
int arr1[] = {1,2,3,4,5};
int arr2[] = {2,3,4,5,6};
int arr3[] = {3,4,5,6,7};
//数组名是数组⾸元素的地址,类型是int*的,就可以存放在arr数组中
int* arr[] = {arr1, arr2, arr3};//指针数组
int i = 0;
for(i=0; i<3; i++)
{
int j = 0;
for(j=0; j<5; j++)
{
printf("%d ", arr[i][j]);
} //等价于 *(*(arr+i)+j)
printf("\n"); //本质上为指针运算!
}
return 0;
}
arr[i]是访问arr数组的元素,arr[i]找到的数组元素指向了整型⼀维数组,arr[i][j]就是整型⼀维数组中的元素。
上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。
-数组指针
我们来类比一下
字符指针:char * 指向字符的指针
整形指针:int * 指向整形的指针
浮点型指针:float * 指向浮点型的指针
那数组指针应该是:存放数组的地址,能够指向数组的指针。
--下⾯代码哪个是数组指针?
int *p1[10]; //1
int (*p2)[10]; //2
答案是第二个为数组指针
解释:p先和*结合,说明p是⼀个指针变量,然后指向的是⼀个⼤⼩为10个整型的数组。所以 p是⼀个指针,指向⼀个数组,叫 数组指针。
这⾥要注意:[ ]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
2.数组指针的初始化
如果要存放整个数组的地址,就得存放在数组指针变量中,如下:
int arr[10] = { 0 };
int(*p)[10] = &arr;
我们调试也能看到 &arr 和 p 的类型是完全⼀致的。
数组指针类型解析:
int (*p) [10] = &arr;
| | |
| | |
| | p指向数组的元素个数
| p是数组指针变量名
p指向的数组的元素类型
- 两者比较
希望对大家有所帮助。