目录
一.前言
之前我们的指针都是指向变量的,那有没有指向数组的指针呢?答案肯定是有的,也就是我们的数组指针。
二. 数组指针的定义
下面我们来通过一段代码实现对数组指针的定义。
int* p1=arr;
int* p2=&arr[0];
这两行代码都是都实现对数组指针的定义,两者虽然形式不一样,但都是获取了数组的首地址的指针。
同理,我们可以使用之前在指针的运算中讲过的步长来遍历数组里面的每一个元素:
for(int i=0;i<len;i++){
printf("%d\n",*p1);
p1++; //步长加一,指向数组的下一个元素
}
三.数组指针的注意点
值得注意的是:当我们的数组arr参与计算的时候,指向它的指针会退化为指向第一个元素的指针。
当然也有特殊情况:当arr进行sizeof运算的时候,它不会退化,arr还是整体。还有就是用&arr获取地址的时候,它也不会退化。但是当使用&arr获取地址的时候,它的步长发生了改变,不再是int数据类型的4个字节了,而是整个数组的字节,也就是4个字节乘以数组的长度。
例如下面这段代码:
int arr[]={1,2,3,4,5,6,7,8};
printf("%zu\n",sizeof(arr)); //打印这个arr数组的整体长度 为8*4=32
printf("%p\n",arr); //打印arr的首地址
printf("%p\n",&arr);
printf("%p\n",arr+1); //打印arr走了一步之后的地址
printf("%p\n",&arr+1); //两者不同获取首地址方式的步长
通过最后程序的运行结果,我们可以发现,使用&arr获取地址的步长,会是32个字节,而使用arr进行地址获取的步长,仍然是int数据类型的字节,也就是4个字节 。