精华内容
下载资源
问答
  • 维数组中数组元素存储地址计算一

    万次阅读 多人点赞 2019-01-31 08:55:59
    关于二维数组中数组元素的存储地址,有同学问出了个好问题。  在我的课件中,出现了下面的讲解:  a[i][j]的地址是p+(i*col+j)*d(d是数组元素所占的字节数)。  同学编程序进行验证,出问题了:  地球停止...

    关于二维数组中数组元素的存储地址,有同学问出了个好问题。
      在我的课件中,出现了下面的讲解:
    在这里插入图片描述
      a[i][j]的地址是p+(i*col+j)*d(d是数组元素所占的字节数)。
      同学编程序进行验证,出问题了:
    在这里插入图片描述
      地球停止转动了也必须先赞这种学习方式!
      同学问:“老师,第一张图的4,我怎么觉得不对呢?第二张图我没4,结果好像也对,这里面差在哪呢?”
      
      我的答复:“两个都对。”
      第一张图在讲原理,是我们在人脑里面要以“字节”为单位计算,p为首地址,单位是字节,再往后多少个字节,必须考虑到在整型数组中每个数组元素占4个字节,从首地址到a[i][j](i*col+j)个元素,计算其字节地址时,乘4是必要的。
      第二张图是在计算机中的运行结果,是已经在计算机内按找第几“个”数组元素为单位计算地址值了,*4的操作,是在寻址中已经计算过了,在此直接输出结果。
      更直白地,第一张图中的“p+”中的加,和我们日常算术中的加一样,我们按“字节”说事;而第二张图中的“p+”,是C语言中指针的加运算,是增加一个单元,究竟多少字节,还要考虑指向的元素的数据类型,在32位系统中,对于整型,一个单元4字节,而对于double型,一个单元8字节。
      两个加号形状一样,含义是不同。
      
      这个问题,学C/C++的同学才可能会遇到,学习C/C++中主动寻疑验证的同学才会遇到。可见学C/C++的价值,可见主动寻疑验证的价值。
      
      想起离散数学中的代数结构,用符号任意地表达运算,研究或设计运算系统,好一个“让思绪飞扬”和”精彩世界“,一不留神却成了“枯燥乏味”和“与实践无关”。
      能从不同层面,不同视角看问题,这就是自由。

    展开全文
  • 今天小编就为大家分享篇关于C++二维数组中数组元素存储地址计算疑问讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 维数组地址计算问题

    万次阅读 2017-09-23 18:09:42
    假设以行优先顺序存储维数组A[5][4][3],其中元素A[0][0][0]的地址为0,且每个元素占2个存储单元,则printf("%d\n",A[4][3]+2)输出什么 好吧,我在笔试的时候居然写了个160,我以为是A[4][3]已经到了5*4*2的地方...

    假设以行优先顺序存储三维数组A[5][4][3],其中元素A[0][0][0]的地址为0,且每个元素占2个存储单元,则printf("%d\n",A[4][3]+2)输出什么


    好吧,我在笔试的时候居然写了个160,我以为是A[4][3]已经到了5*4*2的地方,也就是40,然后再加5*4*2,就又是一个40,再乘以2就是到了160的地方(完全错误的想法,脑子太糊涂了,难怪面试总过不了)


    正确思路:

    行优先:从右往左进位
    列优先:从左往右进位

    把三维坐标想象成立方体。分配的空间A[5][6][7]表示层高为5、行数为6、列数为7
    因为数数的基本单位其实是列,二维坐标是行号列号,虽然平时可能习惯行号列号层号,但是按照二维的规律,那么三维坐标应该是层号行号列号

    那么A[4][3][2]中4、3、2分别对应这个点的层数、行号、列号
    位置为4*(4*3)+3*3+2=59
    每个元素两个存储单元,最终结果为59*2=118

    源码:

    #include<stdio.h>
    #include<string.h>
    int main(int argc, const char *argv[])
    {
        short a[5][4][3];
        printf("short:%d\n",sizeof(a[0][0][0]));
        printf("a[5][4][3]:%d\n",sizeof(a)/sizeof(a[0][0][0]));
        printf("a[5][4][3]:%d\n",&(a[4][3][2])-&a[0][0][0]);
        printf("a[5][4]+2:%d\n",(a[4][3]+2)-&a[0][0][0]);
    
        return 0;
    }

    运行结果:



    这里就有个问题值得思考了,为什么输出的是实际的个数,而不是两者地址的减呢?

    来看下面的示例



    看到这里应该稍微明白了一点,三维数组第一个元素地址和第二个元素地址之间确实是差2
    但是为什么减是1呢?
    我是这么想的,&a[0][0][0]就可以假设是指针p1,&a[0][0][1]就可以假设是指针p2,那一减不就是1吗?
    &a[0][0][0]不是这个元素的首地址,而是这个数组的首地址,指的是这个元素所拥有的这一块(2个字节)地址,恩,不晓得我说的对不对,如果不对的话,请在下面评论或者私信我。

    这是杨哥的一篇关于指针的博客:下面这段话的出处
    http://blog.csdn.net/morixinguan/article/details/50446419

      我们也常听很多人说,数组的首地址就是数组的第一个元素,可以这么说,但是,它们之间实质是不能等效的,为什么这么说?

             数组的首地址和数组的首元素的首地址是完成不同的概念,看着名字很像,其实有所区别。数组名是个左值,但不是可修改的左值,而数组首元素的首地址,也就是0地址,你可以对它进行赋值,就相当于给数组的元素赋值。所以数组的首地址和数组的首元素的首地址是不相同的概念,请那些所谓的程序员不要误导初学者。(嗯,说的好像就是我这种什么都不懂的菜鸡)


    展开全文
  • 二维数组_一维数组

    2016-10-05 16:06:00
    维数组在内存中占据连续的空间。在内存中从上到下存储各行元素,在同行中按照从左到右的顺序存储。 因此可以根据行号和列号计算出相对于数组首地址的偏移量...二维数组转化为位数组: #include <iostr...

    二维数组在内存中占据连续的空间。在内存中从上到下存储各行元素,在同一行中按照从左到右的顺序存储。

    因此可以根据行号和列号计算出相对于数组首地址的偏移量,从而找到对应元素。

    eg.      int *matrix    rows行columns列   matrix[ row * columns + column]

    二维数组转化为一位数组:

    #include <iostream>
    
    using namespace std;
    
    void display(int* matrix)
    {
      cout << matrix[4] << endl;    //代表二维数组a的第二行,第一个元素
    }
    
    int main()
    {
        int a[2][3];
        for(int i = 1; i <= 2; ++i)
            for(int j = 1; j <= 3; ++j)
            {
                a[i-1][j-1] = i+j;
                cout << a[i-1][j-1] << " ";
                if(j % 3 == 0)
                    cout << endl;
            }
        display(a[0]);     //将二维数组第一行的首地址(即二维数组首地址)传入
    
        cout << "Hello World!" << endl;
        return 0;
    }

     

    转载于:https://www.cnblogs.com/Lunais/p/5932382.html

    展开全文
  • 给定下列声明 : int array[4][2]; 请写出下面每个表达式的值,假定数组的起始位置为1000,整型值在内存中占据了2个字节的空间。...表示个4行2列的数组。 1000 1002 1004 1006 10.

    给定下列声明 :

    int array[4][2];
    
    

    请写出下面每个表达式的值,假定数组的起始位置为1000,整型值在内存中占据了2个字节的空间。(这里的1000是十进制) 

    计算以下表达式值:

    • array
    • array+2
    • array[3]
    • array[2]-1
    • &array[1][2]
    • &array[2][0]

    首先我们看一下这个表达式定义int array[4][2];表示一个4行2列的数组。

    1000 1002
    1004 1006
    1008 1010
    1012 1014

    array表示数组起始地址1000(十进制);

       
       
    ->1008             
       

    array+2表示 “指向包含4个2个整形元素的数组的指针”,但是它指向array的另一行,即第3行。这个指针的地址就是第3行的起始地址,也就是1000加8个字节,即1008(十进制)。

       
       
       
    ->1012             

    array[3]表示第4行,这个表达式是一个一维数组,也就是首地址是1000+12个字节,即1012(十进制)。

     

       
                    ->1006    
       
       

    array[2]-1,array[2]表示第三行的一维数组,其首地址也就是1000+8个字节,即1008(十进制),再减1,表示减去这个一维数组的1个元素长度,每个一维数组元素是2个字节,也就是1008-2也就是1006(十进制)。

     

       
       
    ->1008            
       

    &array[1][2], array[1][2]前面的1维的1表示第2行,但是后面的2却超出了这个后面的一维数组的范围,array[1][1]的地址是1006(十进制),array[1][2]就相当于array[1]指向的第2行这个一维数组的后面一个位置,这里因为是连续存储的,所以刚好就是第3行第1个元素,即1008(十进制)

       
       
    ->1008            
       

    &array[2][0]表示第3行第1个元素的地址,这里是1008(十进制)

     

    展开全文
  • 一维数组

    2021-05-15 16:16:46
    一维数组前言一、静态一维数组二、动态一维数组三、一维数组遍历 前言 数组的优点和缺点,并且要理解为什么? 第一:空间存储上,内存地址是连续的。 第二:每个元素占用的空间大小相同。 第三:知道首元素的内存地址...
  • 维数组存储

    2019-02-24 22:42:35
    一维数组,而一维数组的每一个元素又都是一个数组。 a[3]这个一维数组的三个元素分别为: a[0],a[1],a[2]。每个元素的大小为 sizeof(a[0]),即 sizof(char)*4。由此可以计算出 a[0],a[1],a[2] 三个元素的首地址...
  • 数组地址计算

    万次阅读 多人点赞 2016-01-09 17:38:50
    数组是一个特殊的数据结构,数组的基本操作不涉及数组结构的变化,因此对于数组而言,采用顺序存储表示比较合适。数组的顺序存储结构有两种:一、以行序存储,如高级... 一维数组:设数组为 A=a1,a2,a3,a4...ai...an
  • 一,n维数组地址计算公式 ji表示n维数组中该元素在第i维中的坐标 ai表示n维数组中第i维的起始坐标 bi表示第i维度的长度 L表示一个元素所占的字节数 LOC(…)表示该坐标对应的存储中的地址(一维坐标) PS.对与简单...
  • 关于数组地址计算

    千次阅读 2019-07-23 00:06:21
    对于一维数组:若设A[] A[]={a1,a2,a3....,ai....an} 设每个数组元素占据d个存储单元,则元素ai的存储地址为 loc(A[i])=loc(A[i])+(i-1)*d 对于二维数组: Amn= (图片由all友情提供,一时找不到纸笔emmm) 若为行序...
  • 1) 计算机会给数组分配块连续的存储空间。 2) 数组名代表数组的首地址,从首地址位置,依次存入数组的元素。 3) 每个元素占用相同的字节数[字节数取决于数组类型] 4) 数组的每个元素之间的地址连续。
  • 前提知识 1、sizeof是个运算符,sizeof(a)计算的是a这种变量类型或结构体所占的字节数 ...那么,既然指针是变量,那么指针必然有自己的存储空间,只不过是该存储空间内的值是地址值,而不
  • 数据结构-二维数组-存储结构

    千次阅读 2017-09-28 11:18:40
    数组的两个主要的顺序存储方式,数组具有随机访问特点,要求能够依据下标计算出任一数组元素的存储地址(概念上的地址):计算机主存的每个地址和存储内的每个字节是一一对应的,而每个字节间的排列顺序是线式的。...
  • 数组版权声明数组一维数组1、一维数组的定义2、一维数组的初始化 版权声明 本文原创作者:清风不渡 博客地址:https://me.csdn.net/WXKKang 数组 学习了Java中的语句结构之后,让我们来学习数组这一模块,那么,...
  • 2维数组与动态创建2维数组

    千次阅读 2014-06-26 16:53:45
    一维数组的逻辑概念是一组数据,由下标指向。在内存分配上是连续的 二位数组的逻辑概念是一个表,由行,列来指向。数据的存储方式通常是按行存储的。 在内存的分配上要看这个二维数组元素到底是什么结构. 例如: a ...
  • 数组--存储地址计算

    千次阅读 2018-03-25 21:49:00
    一维数组存储地址计算 假设数组的首位置是:a 每个元素所占空间为:len 则,可以推断出a[i]的地址是:a+i*len 二维数组按行存储a[3][5] 假设数组的首位置是:a 每个元素所占空间为:len 则,可以...
  • 数组元素的地址计算问题(一维到高维)

    万次阅读 多人点赞 2016-08-22 21:38:00
    数组元素存储地址计算 一维数组一维数组A[n]存放在n个连续的存储单元中,每个数组元素占一个存储单元(不妨设为C个连续字节).如果数组元素A[0]的首地址是L,则A[1]的首地址是L+C,A[2]的首地址是L+2C,… …...
  • 数据结构——三维数组地址

    千次阅读 2019-12-17 17:58:35
    假设A[0][0][0]的存储地址为a,其中每个元素所占内存空间为b,那么计算A[x][y][z]的存储地址的公式为a+(xmk+yk+z)b 三位数组按行优先存储在内存空间中的存储方式为: 首先将第行第列的页存满,再存第行第...
  • 假设A[0][0][0]的存储地址为a,其中每个元素所占内存空间为b,那么计算A[x][y][z]的存储地址的公式为a+(xmk+yk+z)b 三位数组按行优先存储在内存空间中的存储方式为: 首先将第行第列的页存满,再存第行第二列...
  • 1) 计算机会给二维数组分配块连续的存储空间 2) 数组名表示该二维数组的首地址,从首地址开始,依次存入第行、第二行…. 3) 每行的存储方式,从首地址开始,依次存入第个元素、第二个元素….. 4) 每...
  • 数组 1.数组的定义: 数组就是一片地址连续且空间大小一致的存储空间(但是每个空间存的还是其他数据的地址) 。数组主要解决多变量多数据... 数组通过角标来访问元素的具体计算方式是 所要访问数据的地址=首元素地...
  • 维数组

    2019-09-29 10:53:26
    维数组A[m][n],这是个m行,n列的二维数组。设a[p][q]为A的第个元素,即二维数组的行下标从p到m,列下标从q到n, 按“行优先顺序”存储时则元素a[i][j]的地址计算为: LOC(a[i][j]) = LOC(a[p][q]) + ((i −...
  • Java(一维数组

    2019-07-25 19:04:00
    数组在内存中是若干个大小一致,类型一样,地址连续的存储空间 提供角标访问元素 如果数组大小为10(10个元素) 角标:0~9 在数组中,查找元素的时间复杂度O(1) 只要计算一次,即可得到元素吗,与元素的个数无关 ...
  • C++中的二维数组

    千次阅读 2017-12-29 21:57:03
    二维数组在计算机中存储时,是按照行形式存储的。...可以理解为是一个一维数组p,这个一维数组p有两个元素,分别为num[0]与num[1],num[0]存储着num数组第一行的首地址,num[1]存储着第二行的首地址。 int num[2]
  • 维数组和指针

    2012-05-28 17:46:24
    原文地址:...我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大
  • 维数组及指针

    2013-09-14 22:07:02
    本文章为转载,转载地址为:...我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维
  • 数组地址计算

    2020-05-07 10:17:36
    1、一维数组 设数组为A = a1,a2,a3,a4…ai…an; 每个数据元素占d个存储单位,则元素a[i]的存储地址为 Loc(A[i])=Loc(A[1])+(i−1)∗dLoc(A[i])=Loc(A[1])+(i−1)∗d Loc(A[i]) = Loc(A[1]) + (i-1)*dLoc(A[i])=Loc(A...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 332
精华内容 132
关键字:

一维数组存储地址计算