问题,以下输出的结果是什么,区别在于哪?

void main()
{
    int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };

    //输出的3个地址都一样,差别在哪?
    printf("\n%x",a);  
    printf("\n%x",*a); 
    printf("\n%x",&a);
system(
"pause"); }

  像我这种野生码农看到这个问题基本懵了,好吧我们先通过一维数组来理解。

void main()
{
    int num[5] = { 1,2,3,4,5 };
    printf("\n%x", num);    //第一个元素的首地址,1个int元素4个字节
    printf("\n%x", &num);   //数组的地址,数组5个元素,20个字节。
    
    //printf("\n%d", (*(&num))[2]); 可以知道 (*(&num))就是数组 {1,2,3,4,5}-> &num是指向整个数组的地址

    //区别
    printf("\n%d", sizeof(*num)); //4   *num 根据类型地址取出内容  => 1 ,4字节
    printf("\n%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("\n");
13     }
14 
15     //3个结果都一样,差别在哪?
16     printf("\n%x",a);  //a行指针
17     printf("\n%x",*a); //a行指针的值 {1,2,3,4}
18     printf("\n%x",&a); //整个二维数组的地址
19     
20     printf("\n%d",sizeof(*a));//  16  -> *a代表一个行的数组 {1,2,3,4} , 
21     printf("\n%d", sizeof(**a));// 4  -> 有上可以推断 **a 代表第一行数组首地址  1
22     printf("\n%d", sizeof(*&a));// 48 -> &a代表整个二维数组的首地址,则 *(&a) 取整个二维数组的内容,12个元素,则48 个字节    
23 
24 
25     system("pause");
26 }

  

posted on 2016-08-02 08:25  睡着的糖葫芦  阅读(281)  评论(0编辑  收藏  举报