c语言数组指针
//数组的名字一般情况下代表首元素的地址。当数组名与取地址符&结合时,得到的是整个数组的地址,与取地址符结合后再在前面加星号则又变为首元素的地址。数组的指针存放的内容就是整个元素的地址&a【举例一个整形5个元素的数组a的数组指针:int (p)[5]=&a】,则数组的首元素的地址为p。
#include<stdio.h>
int main()
{
int i=0;
int arr[5]={1,2,3,4,5};
//printf("%p\n",arr);//代表数组首元素的地址
//printf("%p\n",arr+1);//代表数组第二个元素的地址
//printf("%p\n",&arr);//代表整个数组的地址
//printf("%p\n",&arr+1);//代表下一个数组的地址
//但为什么取地址arr和&arr打印的地址值是相同的呢,因为它们得到的都是首元素的地址
//检测对整个地址间接引用后输出的内容
//printf("%d\n",*arr);//y由于arr代表的是数组首元素的地址,对首元素的地址进行间接引用输出的是首元素的内容1
//printf("%p\n",*&arr);
printf("%d\n",*&arr+1);//通过+1进行验证,对&+arr为整个数组地址然后进行间接引用得到的是首元素的地址,为int型
//for (i=0;i<5;i++)//通过地址进行 遍历数组
//{
//*printf("%d\n",*(*&arr+i));*///*&arr代表首元素的地址由于优先级的原因需要增加括号*&arr+i代表第i个元素的地址,然后间接引用达到遍历数组的目的,正常没有这么使用的,但通过这两个例子可以掌握 首元素地址和数组元素的地址的关系&arr代表数组的地址加*代表数组首元素的地址
//printf("%d\n",*(arr+i));//arr代表首元素的地址由于优先级的原因需要增加括号arr+i代表第i个元素的地址,然后间接引用达到遍历数组的目的
//}
//arr++;提示错误为表达式是一个可修改的左值,说明arr数组名是一个常量不能改变(除了sizeof使用时),我们规定数组名字是一个常量,如不是常量,++后则无法找到声明的数组。
//与单独变量名字有区别,正常可以使用单独变量的名字找到空间,
//为数组定义一个指针
//int( * arr1)[5]=&arr;//由于&arr是数组的地址,则需知道首元素的类型为int [5](去掉变量名),然后加*加变量名,考虑优先级的原因需要加(),否则arr1与结合【5】则为一个数组。arr1是这个数组的指针,存放整个数组的地址那么arr1是什么类型的?答:int(*)【5】,经过 printf("%d\n",sizeof(int( * )[5]));运算为指针类型4个字节
//用arr1数组的指针区遍历arr数组的方法
//for (i=0;i<5;i++)//通过地址进行 遍历数组
//{
//printf("%d\n",*(*arr1+i));//对整个数的地址机型
//}
return 0;
}