• 二维数组中数组名与其指针的关系


    大多数初学者不是很清楚二维数组是个怎样的存在,今天我就来说说这个二维数组,计算机内存是一连串的存储单元,我们可以把它理解成一条线,没错就是一条线,那么问题来了,二维是个怎样的存在呢???说白了,二维数组并不真是二维,只是人们主观的将它变成二维,举个例子吧!比如楼梯,我们都知道楼梯说白了就是一条路,但是我们刻意将楼梯来回上升的方式,这都是我们主观的改变,实际上我们可以看成是一个直路,只是被工人弄弯了。好了,不扯了,进入主题。。。。

    二维数组名a是数组第一行的指针,它指向的是一整行,*a才是a[0][0]的地址,数组名a是一整行地址,*a是一个元素的地址,但此时p=a,这个p却是a[0][0]的地址看下面的程序

     1 #include<stdio.h>
     2 
     3 int main()
     4 {
     5     int a[2][3]={1,2,3,4,5,6},*p;
     6     
     7     p=a;
     8     
     9     printf("%d %d %d
    ",p,a,*a);
    10     
    11     return 0;
    12 }

    结果显示

    第一行的地址和第一个元素首地址肯定相同,我们继续看

     1 #include<stdio.h>
     2 
     3 int main()
     4 {
     5     int a[2][3]={1,2,3,4,5,6},*p;
     6     
     7     p=a;
     8     
     9     printf("%d %d
    ",(p+1),*(a+1));
    10     
    11     return 0;
    12 }

    结果显示,可以看出,地址差异出来了,第0行的地址为6487600,所以a[0][1]就是6487604,而第一行的地址为6487612,第0行和第1行是不是相差了3个int型字节,所以这就证明了a是数组第一行的指针,它指向的是一整行,p指向的是一个元素

    继续证明

     1 #include<stdio.h>
     2 
     3 int main()
     4 {
     5     int a[2][3]={1,2,3,4,5,6},*p;
     6     
     7     p=a;
     8     
     9     printf("%d %d
    ",*(p+1),**(a+1));
    10     
    11     return 0;
    12 }

    结果

    结论:**a才表示a[0][0],*a表示a[0][0]的地址,a表示第一行的地址

  • 相关阅读:
    WisDom .net开发框架设计 2
    多线程处理大数组
    C#核心语法
    怎样控制与复制相同的功能
    SQL 内存数据库的细节
    验证编辑方法(Edit method)和编辑视图(Edit view)
    上传图片检测其是否为真实的图片 防范病毒上传至服务器
    chrome切换hosts插件 hostsadmin
    程序托盘图标+右键弹出菜单
    30多年程序员生涯经验总结(成功源自于失败中的学习;失败则是因为容忍错误的横行)
  • 原文地址:https://www.cnblogs.com/cdp1591652208/p/6971386.html
Copyright © 2020-2023  润新知