C语言数组

  1. 数组的定义

    数组是用来存放数据类型相同且逻辑意义相同的数据

  2. 数组的大小

    数组的大小不能是变量,必须是常量或者常量表达式,常量表达式由编译器编译时自动求值。

    也可以不指定数组大小,但必须对数组进行初始化,编译器在编译时会根据初始化列表中元

    素的个数计算数组大小,例如:

    int nAry[]={1,3,4};
  3. 数组的初始化

    在定义数组时可以使用初始化列表进行初始化,例如:

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

    但是只能在定义时使用这种方式赋值,在其他地方只能进行单个元素赋值.

    如果数组的数据类型是基本数据类型,如果在初始化列表中只对前面几个

    元素进行初始化,后面没有进行赋值初始化,那么剩下的元素将被初始化

    为0,例:

  4. 关于数组名

    • 数组名是数组的首地址,它是一个常量,所以不可以对数组名使用自增或者自减运算符
    • 对数组名使用sizeof运算符,可以获取到数组所占用的字节数,但是如果数组名做为参

      数传递给函数,在函数内部对这个数组参数使用sizeof,求得的只是这个指针参数的大

      小,并不是数组大小. 例:

  5. 数组寻址:

    • 一维数组寻址

      设有一维数组Type Arry[N],其中Type表示数组中元素的类型,Arry表示数组名,

      N表示元素个数,那么数组中第n个元素的内存地址为:(int)Arry+n*sizeof(Type)

      例:

    • 二维数组寻址

      设有二维数组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);
      }
      }

      运行结果:

    • 三维数组寻址

      设数组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));
      }
      }
      }

      运行结果:

    • 任意多维数组寻址

      设多维数组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)

C语言数组寻址的更多相关文章

  1. Go语言数组和切片的原理

    目录 数组 创建 访问和赋值 切片 结构 初始化 访问 追加 拷贝 总结 数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念,数组作为最常见的集合在编程语言中是 ...

  2. C语言-数组篇

    C语言数组 一.数组的概念 用来存储一组数据的构造数据类型 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. 二.数组的定义 格式: 类型 数组名[元素个数] ...

  3. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  4. C语言 数组 列优先 实现

    C语言数组结构列优先顺序存储的实现 (GCC编译). 从行优先转换为列优先存储方式, 与行优先相比, 不同之处在于改变了数组维界基址的先后顺序, 从而改变了映像函数常量基址. /** * @brief ...

  5. C语言 数组 行优先 实现

    C语言数组结构行优先顺序存储的实现 (GCC编译). /** * @brief C语言 数组 行优先 实现 * @author wid * @date 2013-11-02 * * @note 若代码 ...

  6. 不可或缺 Windows Native (5) - C 语言: 数组

    [源码下载] 不可或缺 Windows Native (5) - C 语言: 数组 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 数组 示例cArray.h #ifn ...

  7. C语言数组

    在C语言中,对于三维或三维以上数组的使用并没有很好的支持,而且使用率也非常的低,后面会对三维数组做一些简单的分析,这篇文章主要以二维数组来探讨一些C语言中数组使用的相关概念和技巧. 1 一个var[i ...

  8. C语言数组:C语言数组定义、二维数组、动态数组、字符串数组

    1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include &l ...

  9. Go语言数组的使用

    Go 语言数组 Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0 ...

随机推荐

  1. 互联网公司技术岗实习/求职经验(实习内推+简历+面试+offer篇)

    找工作的事基本尘埃落定了,打算把这大半年来积累的经验写下来,基本都是我希望当年找实习的时候自己能够知道的东西,帮师弟师妹们消除一点信息不平等,攒攒RP~ 不要像我当年那样,接到电话吓成狗,没接到电话吓 ...

  2. webpack 5 模块联合

    webpack 5 模块联合 webpack 5 https://webpack.docschina.org/concepts/module-federation/ https://github.co ...

  3. 如何在 GitHUb 上使用 gitbook 发布一本在线书籍

    如何在 GitHUb 上使用 gitbook 发布一本在线书籍 ebook / pdf refs https://docs.gitbook.com/integrations/github xgqfrm ...

  4. HTML5 Learning Paths

    HTML5 Learning Paths HTML5 Expert refs https://developer.mozilla.org/en-US/docs/Web/HTML xgqfrms 201 ...

  5. html fragment & html template & virtual DOM & web components

    html fragment & html template & virtual DOM https://developer.mozilla.org/en-US/docs/Web/API ...

  6. Mybatis-06 动态Sql

    Mybatis-06 动态Sql 多对一处理 多个学生,对应一个老师 对于学生这边而言,关联多个学生,关联一个老师 [多对一] 对于老师而言,集合,一个老师又很多学生 [一对多] 1.创建数据库 2. ...

  7. java中this和super的用法及区别

    this 用法1:代表当前对象本身 用法2:方法形参和类成员变量重名,用this进行区别 class demo{ private int age = 10; public int getAge(int ...

  8. SQL Server中DELETE和TRUNCATE的区别

    ​DELETE和TRUNCATE语句之间的区别是求职面试中最常见的问题之一.这两条语句都可以从表中删除数据.然而,也有不同之处. 本文将重点讨论这些差异,并通过实例加以说明. TRUNCATE DEL ...

  9. 翻译:《实用的Python编程》02_05_Collections

    目录 | 上一节 (2.4 序列) | 下一节 (2.6 列表推导式) 2.5 collections 模块 collections 模块为数据处理提供了许多有用的对象.本部分简要介绍其中的一些特性. ...

  10. JavaScript 模拟 sleep

    用 JS 实现沉睡几秒后再执行,有好几种方式,但都不完美,以下是我感觉比较好的一种方式 function sleep(time) { return new Promise((resolve) => ...