zoukankan      html  css  js  c++  java
  • 多级数组指针存储结构猜想

    在学习数组指针的时候,很多时候都觉得很乱,因为到底哪个是哪个的地址啊。通常老师会做这样的讲解。

    不妨用3维数组进行讲解。首先,在这里要纠正老师的一个错误,那就是,通常,老师会说a[0]里存放的是a[0][0]的地址,没仔细想觉得是对的,然而,我们再来看这句话,有个关键词“存放”,也就是说,a[0][0]这个空间存放了一个地址,也就是说啊a[0]的内容是一个地址,也许你已经发现错误了,我当时在学的时候,也没有发现,因为没认真听。那么,错误在哪呢?其实a[0][0]的内容并不是一个地址,而是一个数据,而且a[0]本身就是地址,不存在存放不存放的问题,应该将这句话修改成a[0]就是a[0][0]的地址。指针所存放的并不是它上一级的地址,而是它上一级的内容,因为它本身就是上一级的地址,不存在所谓的存放问题,希望大家在学习的过程中牢记。

    那么接下来的重点来了我们要讨论的是指针的存储方式,那么按照上述的存储方式,我们默认的为指针开辟了一个空间,也就是说默认的将指针空间是区别于数据存储的空间的,那么问题来了,编写简单测试程序测试下面的代码:

    double a[2][1][1]={2,3.0};
    cout<<&a<<endl;
    cout<<&a[0]<<endl;
    cout<<&a[0][0]<<endl;
    cout<<&a[0][0][0]<<endl;

    你会发现,他们的值都是相同的,那么也就是说他们都是存放在同一个存储空间中的,上面的存放方式不攻自破。

    接着运行下面的代码:

    cout<<a<<endl;
    cout<<*a<<endl;
    cout<<*(*a)<<endl;
    cout<<*(*(*a))<<endl;

    你会发现最后会出现数据,疑问就来了,他们都是在访问同一个空间中的内容,为什么内容的值会发生变化呢?自然而然,我们会想到,一定是空间内部的存储方式和访问方式有些特别。我也是这样想的,并且,我做了一个猜想,假设在a[0][0][0]所在的空间中。

    如图·,外面大的矩形表示其存储空间,内部存储了指针,那么计算机是怎么获取内容的呢,下面是我的猜想:

    首先,如果存在a计算机就会访问到该空间,因为a也是这个空间的地址,而且会根据"[]"这个符号来分割空间,如图,被分割成了4个空间,因为数据加上3个[]为4,计算机在获取a之后,便判断有多少个[],假设为n个,那么计算机会沿着箭头进行取值,作为内容送出,而且会将前一个的内容作为地址,访问该空间,这也解释了符号[],很像一个空间符号,相当于距离a的多少个空间。哈哈,只是有点形象而已,也许在计算机设计者眼里也是为了理解方便吧。

    这只是我的一个假想,如有错误的地方,其指出,也请包涵。

    敢于面对难题,敢于面对自己。
  • 相关阅读:
    c#操作ElasticSearch5详解
    消息推送服务
    Elasticsearch5.0.1 + Kibana5.0.1 + IK 5.0.1
    C#使用ES
    C# 开发人员的函数式编程
    Swagger文档转Word
    Spring Security OAuth2 Demo -- good
    is not eligible for getting processed by all BeanPostProcessors
    成功都一样,失败各不同;失败的项目也许值得你警醒
    java.exe进程来源排查录
  • 原文地址:https://www.cnblogs.com/cittysteven/p/6605691.html
Copyright © 2011-2022 走看看