问题,以下输出的结果是什么,区别在于哪?
void main() { int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; //输出的3个地址都一样,差别在哪? printf(" %x",a); printf(" %x",*a); printf(" %x",&a);
system("pause"); }
像我这种野生码农看到这个问题基本懵了,好吧我们先通过一维数组来理解。
void main() { int num[5] = { 1,2,3,4,5 }; printf(" %x", num); //第一个元素的首地址,1个int元素4个字节 printf(" %x", &num); //数组的地址,数组5个元素,20个字节。 //printf(" %d", (*(&num))[2]); 可以知道 (*(&num))就是数组 {1,2,3,4,5}-> &num是指向整个数组的地址 //区别 printf(" %d", sizeof(*num)); //4 *num 根据类型地址取出内容 => 1 ,4字节 printf(" %d", sizeof(*&num));//20 *&num 根据类型地址取出内容 getchar(); }
通过上面的例子,可以知道
1. num就是指向数组的首地址,由此可得 *num 就是数组首地址的值 1。
2. &num 就是指向整个数组的地址。
于是我们再来看上面二维数组的例子解答。
1 void main() 2 { 3 int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; 4 5 //打印出整个数组的元素和对应的地址 6 for (int i = 0; i < 3; i++) 7 { 8 for (int j = 0; j < 4; j++) 9 { 10 printf("%d,%x ",*(*(a+i)+j), *(a + i) + j); 11 } 12 printf(" "); 13 } 14 15 //3个结果都一样,差别在哪? 16 printf(" %x",a); //a行指针 17 printf(" %x",*a); //a行指针的值 {1,2,3,4} 18 printf(" %x",&a); //整个二维数组的地址 19 20 printf(" %d",sizeof(*a));// 16 -> *a代表一个行的数组 {1,2,3,4} , 21 printf(" %d", sizeof(**a));// 4 -> 有上可以推断 **a 代表第一行数组首地址 1 22 printf(" %d", sizeof(*&a));// 48 -> &a代表整个二维数组的首地址,则 *(&a) 取整个二维数组的内容,12个元素,则48 个字节 23 24 25 system("pause"); 26 }