探究使用指针来访问数组
第一个元素获得数组首地址
在数组中一般是使用下标来访问数组中的元素,所以我们知道数组元素在内存中是连续的
所以第一个元素的首地址,就是整个元素的首地址,如下:
int are[3] = {0,1,2} ;
int *pa;
pa = are;数组名也即首地址
pa;//指针pa指向数组的第一个元素首地址
pa+1;指针pa指向数组的第二个元素
pa+2;指针pa指向数组的第三个元素
以此类推
因此也可利用取值运算符*来访问或修改其中的值
int are[10] = {0,1,2,3,45,6,7,89,10,51} ;
int *pa,*pb;
pa = are;
pb = &are[9];
printf("%d\n",pb - pa);
pa = pb;
printf("%p\n",pa);
printf("%p\n",pb);
printf("%d\n",*pa);
printf("%d\n",*pa);
指针访问数组
数组时 利用下标 a[i] i++ 这种形式
*(数组名+偏移量)
偏移量:就是指针指向地址与首地址相差几个元素。
下标运算符最终会展开为指针的形式即:
a[i] 展开运算时为 *(a+i)
数组指针
本质是指针,指向数组 .对象一般是二维数组
are+i = &are[i] //控制行
*(are+i) = *&are[i] = are[i]
are[i]+j = &are[i][j]
*(are[i]+j) = *&are[i][j] = are[i][j] = *(*(are+i)+j)
int (*aa)[2] = {0};//与列保持一致
int are[2][2]= {{1,2},{3,4}} ;
aa = are;//数组名是数组的首地址
int i , j;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
printf("%d ",aa[i][j]);
printf("%d ",are[i][j]);
printf("%d ",*(are[i]+j));
printf("%d ",*&are[0][0]+1*2+1);
}
printf("\n");
}
指针数组
本质是数组 ,每个元素是一个指针变量
int *p = NULL;
int *aa[5] = {NULL};
int bb[5] = {7,4,3,9,6};
int i;
for(i=0;i<5;i++){
aa[i] = &bb[i];
printf("%p\n",aa[i]);
printf("%d\n",*aa[i]);
}
int aa[5] = {9,5,2,7,88};
int *bb[5] = {NULL};
int i;
for(i=0;i<5;i++){
bb[i] = &aa[i];
printf("%p\n",bb[i]);
printf("%d\n",*bb[i]);
}