精华内容
下载资源
问答
  • 数组寻址
    2021-05-21 15:01:04

    在一个论坛看到了,觉得讲得很不错。转来跟大家 分享一下

    首先是一维数组的寻址

    int main()

    {

    int arry[10] = {1,2,3,4,5,6,7,8,9,10};

    return 0;

    }

    代码仅此而已,由于只是为了摸这数组寻址的原理和步骤,所以我就只写这点东西了,

    调试,得知数组首地址为:0x0012ff58,如果我想知道他第1个元素的地址

    那么依照公式:数组首地址+sizeof(type)*下标

    代入各项的值可得如下公式: 0x0012ff58 + sizeof(int)*1

    0x0012ff58 + 4*1

    0x0012ff58 + 4

    (8 + 4) = 12  转换成16进制 = C

    所以由此可算出arry的第一个元素内存地址是:0x00ff12ff5c

    然后是二维数组或者**数组的寻址了

    看代码

    int main()

    {

    int arry[3][3] = {{1,2,3},{1,2,3},{1,2,3}};

    return 0;

    }

    我的天,我最讨厌的**数组,之所以讨厌**数组,是因为他绕来绕去,哎,没办法,也要理解他啊!

    其实寻址方式和一维的一样

    简单的来说吧

    一维数组的寻址公式是:数组首地址 + sizeof(type)*数组下标

    那么二维数组可以把前面的看成是后面的首地址

    比方说数一维数组的首地址是arry, 现在有二维数组arry[3][3],那么我们把二维数组的首地址可以看成是arry[3],这就是他的首地址!

    伪图示: 是不是这又变成了一维数组呢?

    (arry[0])[3]

    arry[0]  可以看成是数组名称

    [3] 就是元素的个数了

    根据上面的公式可以这样算:调式得知arry的首地址为:0x0012ff5c

    数组存储首地址是第0个元素

    所以可知 arry[0]的内存地址为0x0012ff5c

    arry[0]里面有三个元素 ,那么根据公式 0x0012ff5c + sizeof(type)*下标

    0x0012ff5c + (4 * 3 = )12

    0x0012ff5c + c(12转换成16进制)

    0x0012ff68

    那么就能得到arry[1]的地址为:0x0012ff68

    再根据上面公式可以知道arry[2]的地址可算出:0x0012ff68 + sizeof(type)*下标

    0x0012ff68 + (4 * 3 = )12

    0x0012ff68 + c(12转换成16进制)

    0x0012ff74

    那么就能得到arry[2]的地址为:0x0012ff74

    有了上面的结果 我想算出arry[2][2]的内存地址,就有了如下的算法:

    借用钱老师的一句名言“你管他什么,套公式就行了!”

    数组首地址 + sizeof(type)*下标

    上面算出了arry[2]的内存地址为 0x0012ff74

    那么arry[2][2]就可以看成是一维数,arry[2]是数组名也就代表了首地址,

    套公式:0x0012ff74 + 4 * 2

    0x0012ff74 + 8

    0x0012ff7c

    由此可算出arry[2][2]的内存地址为:0x0012ff7c

    更多相关内容
  • C++三维数组寻址过程

    千次阅读 2018-08-23 11:45:42
    问题:定义一个三维数组int a[rows][cols][comps],如何从int* p0 = &a[0][0][0]寻址到相应的int* p = &[i][j][k]. 解答:寻址先后顺序:x轴->y轴->z轴。沿x轴寻址结果为i * (cols *...

    1. 寻址原理

    问题:定义一个三维数组int a[rows][cols][comps],如何从int* p0 = &a[0][0][0]寻址到相应的int* p = &[i][j][k].
    解答:寻址先后顺序:x轴->y轴->z轴。沿x轴寻址结果为i * (cols * comps);在沿y轴寻址结果为i * (cols * comps) + j * comps; 最后再沿z轴寻址结果为i * (cols * comps) + j * comps + k

    2.验证代码

    #include <iostream>
    using namespace std;
    
    int main()
    {
        const int rows = 2;
        const int cols = 3;
        const int comps = 4;
    
        const int i = 1;
        const int j = 2;
        const int k = 3;
    
        int a[rows][cols][comps];
        int *p0 = &a[0][0][0];
        int *p = &a[i][j][k];
        int idx = i * (cols*comps) + j * comps + k;
    
        cout << p0 + idx << " " << p << endl;
    
        system("pause");
        return 0;
    }
    展开全文
  • 数组寻址(一维和二维)

    千次阅读 2018-10-02 21:13:01
    #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { int a[3]={0,1,2}; printf("a=%d\n",a); printf("*a=%d\n",*a); printf("...a+...

     

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int a[3]={0,1,2};
    
            printf("a=%d\n",a);
            printf("*a=%d\n",*a);
            printf("a[0]=%d\n",a[0]);
    
            printf("a+1=%d\n",a+1);
            printf("*(a+1)=%d\n",*(a+1));
            printf("a[1]=%d\n",a[1]);
    	return 0;
    }

     

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int a[3][2]={0,1,2,3,4,5};
    
            printf("a=%d\n",a);
            printf("*a=%d\n",*a);
            printf("a[0]=%d\n",a[0]);
    	printf("&a[0][0]=%d\n",&a[0][0]);
    
            printf("a+1=%d\n",a+1);
            printf("*(a+1)=%d\n",*(a+1));
            printf("a[1]=%d\n",a[1]);
            printf("&a[1][0]=%d\n",&a[1][0]);
    
    	printf("*((a+1)+1)=%d\n",*((a+1)+1));
    
    	printf("a[1]+1=%d\n",a[1]+1); //方法1,a[1][1]的地址
    	printf("*(a[1]+1)=%d\n",*(a[1]+1));
            printf("*(a+1)+1=%d\n",*(a+1)+1);//方法2,a[1][1]的地址,*(a+1)表示a[1]
    	printf("*(*(a+1)+1)=%d\n",*(*(a+1)+1));//*(a+1)表示a[1]
    	return 0;
    }
    

    展开全文
  • C语言数组寻址

    2019-06-11 10:24:00
    C语言数组 数组的定义 数组是用来存放数据类型相同且逻辑意义相同的数据 数组的大小 数组的大小不能是变量,必须是常量或者常量表达式,常量表达式由编译器编译时自动求值。 也可以不指定数组大小,但必须对数组进行...

    C语言数组

    1. 数组的定义
      数组是用来存放数据类型相同且逻辑意义相同的数据
    2. 数组的大小
      数组的大小不能是变量,必须是常量或者常量表达式,常量表达式由编译器编译时自动求值。
      也可以不指定数组大小,但必须对数组进行初始化,编译器在编译时会根据初始化列表中元
      素的个数计算数组大小,例如:

      int nAry[]={1,3,4};
    3. 数组的初始化
      在定义数组时可以使用初始化列表进行初始化,例如:

       int nAry[3]={0,3,3};

      但是只能在定义时使用这种方式赋值,在其他地方只能进行单个元素赋值.
      如果数组的数据类型是基本数据类型,如果在初始化列表中只对前面几个
      元素进行初始化,后面没有进行赋值初始化,那么剩下的元素将被初始化
      为0,例:
      数组初始化.png

    4. 关于数组名
      • 数组名是数组的首地址,它是一个常量,所以不可以对数组名使用自增或者自减运算符
      • 对数组名使用sizeof运算符,可以获取到数组所占用的字节数,但是如果数组名做为参
        数传递给函数,在函数内部对这个数组参数使用sizeof,求得的只是这个指针参数的大
        小,并不是数组大小. 例:
        sizeof数组大小.png
    5. 数组寻址:
      • 一维数组寻址
        设有一维数组Type Arry[N],其中Type表示数组中元素的类型,Arry表示数组名,
        N表示元素个数,那么数组中第n个元素的内存地址为:(int)Arry+n*sizeof(Type)
        例:
        一维数组寻址.png

      • 二维数组寻址
        设有二维数组Type Arry[M][N],那么数组中第Arry[m][n]个元素的内存地址为:
        (int)Arry+sizeof(Arry[0])m+sizeof(Type)n
        例:

         int nAry[10][3];
        
         for (int iIndex = 0; iIndex < 10; iIndex++)
         {
           for (int jIndex = 0; jIndex < 3; jIndex++)
           {
             printf("nAry[%d][%d]地址:%08X\t", iIndex, jIndex,&nAry[iIndex][jIndex]);
             printf("手工计算nAry[%d[%d]地址:%08X\r\n", iIndex, jIndex, (int)nAry + sizeof(nAry[0])*iIndex+sizeof(int)*jIndex);
           }
         }

        运行结果:
        二维数组寻址.png

      • 三维数组寻址
        设数组Type Arry[M][N][P],那么数组中第Arry[m][n][p]个元素的内存地址为:
        (int)Arry + sizeof(Arry[0])M + sizeof(Type)(n*P+p);
        例:

          int nAry1[3][4][5];
        
          for (int iIndex = 0; iIndex < 3; iIndex++)
          {
            for (int jIndex = 0; jIndex < 4; jIndex++)
            {
              for (int mIndex = 0; mIndex < 5; mIndex++)
              {
                printf("nAry[%d][%d][%d]地址:%08X\t", iIndex,
                  jIndex, mIndex,
                  &nAry1[iIndex][jIndex][mIndex]);
                printf("手工计算nAry[%d][%d][%d]地址:%08X\r\n",
                  iIndex, jIndex, mIndex, 
                  (int)nAry1 + sizeof(nAry1[0])*iIndex + sizeof(int)*(jIndex * 5 + mIndex));
              }
            }
          }
        
        运行结果:
        三维数组寻址.png
      • 任意多维数组寻址
        设多维数组Type Arry[M][N][O].....[Y][Z],那么该数组中任意一个数组元素
        Arry[m][n]....[y][z]的内存地址为:
        (int)Arry + sizeof(Arry[0])*m + sizeof(Type)*(n*O+..+y*Z+z)

    转载于:https://www.cnblogs.com/UnknowCodeMaker/p/11001978.html

    展开全文
  • 【004.Matlab基础 数组寻址与处理 】

    千次阅读 2015-08-09 21:11:52
    数组寻址技术 寻址方法 说明 A(r,c) 用定义的r和c索引向量来寻找A的子数组 A(r,:) 用r向量定义的行和对应于行的列得到A的子数组 A(:,c) 用c向量定义的列和对应于列的行得到A的子数组 A(:) 用...
  • 基于数组寻址的SCL算法实现S7-1200_1500中的配方功能Recipe
  • 数组寻址

    千次阅读 2020-11-16 13:59:06
    一维数组寻址公式 若一维数组的下标下界为LB,上界为UB,每个元素占用S个存储单元,第一元素(其下标为LB)的地址为LOC(LB),下标为i的数组元素A[i]的地址为LOC(i),则计算LOC(i)的寻址公式为: LOC(i)=LOC(LB)+(i−LB...
  • 二维数组和多维数组的本质及寻址方式      二维数组和多维数组的本质还是一维数组,一维数组是一个特殊的一维数组数组数组就是多维数组,这个数组的元素不是基本数据类型,而是数组。 ...
  • Matlab数组创建、数组寻址、数组排序、数组检测、数组结构 一、数组创建 1、一维数组的创建 P43 2、二维数组的创建 P45 二、数组寻址 1、一维数组寻址 P46 2、二维数组寻址 P49 三、数组排序 1、一维数组排序 P50 2...
  • 这一节再来看看数组寻址问题,数组元素的读取,写入,元素之间的内容传送。 有测试代码: int main(int argc,char *argv[]) { int s[5]={0}; s[3]=3; int x=s[2]; s[0]=s[1]; return 0; } ...
  • 此文描述了数组指针与二维数组寻址的相关内容,具体内容请看下面  引例:已知如下程序  1 #include  2 main()  3 {  4 int x[3][4] = {1,3,5,7,9,11,2,4,6,8,10,12} ;  5 int (*p)[4] =...
  • #一:数组的类型定义 ...#三:多维数组物理地址寻址: 注:r表示数据类型所占字节大小 m是行序,n是列序 ##二维数组Amn物理地址计算公式: 按行序求地址: Loc(aij)= Loc(a11) + ((i-1) *n +
  • 离散数学-二维数组元素寻址

    千次阅读 2019-10-05 21:03:10
    数组元素的地址计算公式 (1) 按行优先顺序存储的二维数组Amn地址计算公式 LOC(aij)=LOC(a11)+[(i-1)×n+j-1]×d 其中: LOC(a11)是开始结点的存放地址(即基地址) d为每个元素所占的存储单元数 由地址计算公式...
  • 摘要:因高级语言不需要熟悉低层软件和硬件知识,所以学生有很大的学习兴趣,数组指针是C语言中的重点内容,学生们都能熟练掌握。而汇编语言因与硬件紧密相连,所以学生学习兴趣不大。为了更好的培养学生的学习兴趣...
  • 二维数组寻址的注意事项

    千次阅读 2011-09-02 06:56:31
    从二维数组的角度来看,a 是二维数组名,a 代表整个二维数组的首地址,也是二维数组0 行的首地址,等于1000。a+1 代表第一行的首地址,等于1008。a[0]是第一个一维数组数组名和首地址,因此也为1000。*(a+0)或*a ...
  • https://www.zhihu.com/question/266170412/answer/309767360
  • 数组和指针寻址

    千次阅读 2012-04-26 23:02:20
    1:数组和字符数组是如何保存的 先来看看C语言源码 #include int main() { int int_a[5]={1,2,3,4,5}; char char_a[] = "hello world"; char * char_pa = "hello world"; } 以下是汇编后的代码 ;...
  • John Bode..34当数组表达式出现在大多数上下文中时,其类型将从"N元素数组T"隐式转换为"指向T",其值设置为指向数组中的第一个元素.此规则的例外情况是,数组表达式是sizeof或者address(of &)运算符的操作数,或者...
  • Java基础篇:数组

    2018-10-10 16:10:12
    在Java中,数组是一种效率最高的存储和随机访问对象的方式,通过寻址公式,随机访问的时间复杂可以达到O(1),但是为了保持空间的连续性,在数组中插入、删除数据时,都需要移动后面数据,该操作的时间复杂度为O(n)。...
  • 一般面试大概率会问到数组与链表的比较,那大家一定都知道数组的查找效率优于链表,那么为什么会这样呢,我们今天来仔细分析下原因。 一、什么是数组? 我想大家应该都知道答案:数组(Array)是一种线性表数据...
  • C语言常见问题(六)——指针与数组

    千次阅读 2021-11-22 09:59:32
    本文旨在分析指针与数组的区别和联系,同时包含以下内容:指针与地址、指针/地址与整数的运算、多级指针;指针与数组的关系、数组名、指针数组数组指针;以及野指针的危害等
  • 数组指针寻址

    2012-09-25 20:37:35
    一维数组寻址 数组名表示[数组第0个元素]的[地址][常量] type array[M] array[N] address is (int)array + sizeof(type) * N 数组长度 sizeof(array) / sizeof(array[0])   二维数组寻址 type array[N][M]...
  • C语言数组与指针

    千次阅读 2021-12-07 16:54:14
    C语言数组与指针一、一维数组二、二维数组三、指针指针运算*p++ 与 *++p四、指针数组与二维指针五、数组指针小试牛刀总结 一、一维数组 数组名是第0个元素的指针常量。 下标运算的结果得到其元素的引用。 下标...
  • 计组——十种数据寻址方式

    千次阅读 2021-09-29 18:14:14
    1. 直接寻址 指令中的形式地址A就是EA,即EA=A 总计访存2次:取指令+执行指令 2.间接寻址 指令中的形式地址是有效地址所在的存储单元的地址,即EA=(A) 总计访存三次:取指令+执行指令(读形式地址+读操作数) 此外...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,694
精华内容 25,477
关键字:

数组寻址