指针与数组名的关系
1.對于一維數組 a[10],一級指針p
p=a;//把數組名(常量地址)賦值給了指針p(正確)
因為p是int指針,而數組名相當于int 常量,所以正確。
p=&a;//編譯時就會出現錯誤,會顯示警告:從不兼容的指針類型賦值。
那是因為&a是取數組a的地址,相當于int()[10]類型的數組指針,而指針p只是普通的一級指針,指向int型變量,不能隨便賦值。
2.對于二維數組名與二級指針
定義:int a[2][5];
int **pa;
pa=a;//編譯時會出現錯誤,會顯示警告:從不兼容的指針類型賦值。
那是因為a指向一維的int數組。內存大小為sizeof(int)*數組長度;
而數組只是指向一個int *類型指針,內存大小為4,所以他們指向的類型是不相同的,不等價,因而無法將二維數組名賦值給二級指針。
3.對于二維數組名只能通過數組指針實現
例如:
int a[2] [5];
int *p[5];
p=a;//此時編譯正確。二者等價,都是指向含有五個元素的一維數組。
相應的可以參考下面的代碼:
#include<stdio.h>
int main()
{
int b[5],a[2][4];
int p,(*pa),(*p1)[4],(*p2)[4];
p=b;
pa=&p;
*pa=b;
p1=a;
printf("%p\n",p1);
printf("%p\n",*p1);
p2=a+1;
p1++;
printf("%p\n",p);
printf("%p\n",pa);
printf("%p\n",*pa);
printf("%p\n",p1);
printf("%p\n",*p1);
printf("%p\n",p2);
printf("%p\n",*p2);
return 0;
}
總結
- 上一篇: 一维数组名与二维数组名的关联
- 下一篇: liunxC下零碎知识点的总结