• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c语言二维数组与指针

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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 }

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
c语言基本数据类型在内存中所占字节发布时间:2022-07-13
下一篇:
c数组与指针的使用注意事项发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap