设为首页 加入收藏

TOP

【C Primer PLus 摘录】第 10 章 数组和指针(未完)(一)
2023-07-23 13:30:38 】 浏览:119
Tags:Primer PLus 摘录 未完

C Primer Plus 摘录

第 10 章 数组和指针

10.1 数组

  • 数组由数据类型相同的一系列元素组成。

  • 通过声明数组告诉编译器数组中内含多少元素和这些元素的类型。 编译器根据这些信息正确地创建数组。

float candy[365];
char code[12];
int states[50];
  • 方括号 [] 表明candy、 code和states都是数组, 方括号中的数字表明数组中的元素个数。

  • 要访问数组中的元素, 通过使用数组下标数(也称为索引) 表示数组中
    的各元素。 数组元素的编号从 0 开始。

10.1.1 初始化数组

  • 用以逗号分隔的值列表(用花括号括起来) 来初始化数组,各值之间用逗号分隔。
int powers[8] = {1,2,4,6,8,16,32,64};
  • 推荐使用宏定义数组长度,只需修改 #define 这行代码即可

  • 要创建只读数组, 应该用 const 声明和初始化数组

const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
  • 存储类别警告:数组和其他变量类似, 可以把数组创建成不同的存储类别(storage class),第12章将介绍存储类别的相关内容。本章描述的数组属于自动存储类别

  • 当初始化列表中的值少于数组元素个数时, 编译器会把剩余的元素都初始化为 0

  • 如果初始化列表的项数多于数组元素个数, 编译器可没那么仁慈, 它会毫不留情地将其视为错误。

  • 如果初始化数组时省略方括号中的数字, 编译器会根据初始化列表中的项数来确定数组的大小。

const int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31 };
  • sizeof days 是整个数组的大小(以字节为单位),sizeof day[0] 是数组中一个元素的大小(以字节为单位)。整个数组的大小除以单个元素的大小就是数组元素的个数。

10.1.2 指定初始化器(C99)

  • C99 增加了一个新特性: 指定初始化器(designated initializer) 。 利用该特性可以初始化指定的数组元素。

  • 对于传统的C初始化语法,要初始化指定元素,则必须同时初始化其之前的所有元素。

int arr[6] = {0,0,0,0,0,212}; // 传统的语法
int arr[6] = {[5] = 212}; // 把arr[5]初始化为212
  • 第一, 如果指定初始化器后面有更多的值, 如该例中的初始化列表中的片段: [4] = 31,30,31, 那么后面这些值将被用于初始化指定元素后面的元素。
  • 第二, 如果再次初始化指定的元素, 那么最后的初始化将会取代之前的初始化。 如开始时把 days[1] 初始化为 28, 但是 days[1] 又被后面的指定初始化 [1] = 29 初始化为 29。
int days[MONTHS] = { 31, 28, [4] = 31, 30, 31, [1] = 29 };

10.1.3 给数组元素赋值

  • 声明数组后, 可以借助数组下标(或索引) 给数组元素赋值。

10.1.4 数组边界

  • 在使用数组时, 要防止数组下标超出边界。 也就是说, 必须确保下标是有效的值。

  • 归功于 C 信任程序员的原则。 不检查边界, C 程序可以运行更快。 编译器不会检查数组下标是否使用得当。 在C标准中, 使用越界下标的结果是未定义的。 这意味着程序看上去可以运行, 但是运行结果很奇怪, 或异常中止。

10.1.5 指定数组的大小

  • 在C99标准之前, 声明数组时只能在方括号中使用「整型常量表达式」。 所谓整型常量表达式, 是由整型常量构成的表达式。
  • sizeof 表达式被视为整型常量, 但是(与C++不同) const 值不是。 另外, 表达式的值必须大于 0
int n = 5;
int m = 8;
float a1[5]; // 可以
float a2[5*2 + 1]; //可以
float a3[sizeof(int) + 1]; //可以
float a4[-4]; // 不可以, 数组大小必须大于0
float a5[0]; // 不可以, 数组大小必须大于0
float a6[2.5]; // 不可以, 数组大小必须是整数
float a7[(int)2.5]; // 可以, 已被强制转换为整型常量
float a8[n]; // C99之前不允许
float a9[m]; // C99之前不允许
  • C99标准允许这样声明, 这创建了一种新型数组, 称为变长数组(variable-length array) 或简称 VLA(C11 放弃了这一创新的举措, 把VLA设定为可选, 而不是语言必备的特性)。
  • C99引入变长数组主要是为了让C成为更好的数值计算语言。

10.2 多维数组

  • 多维数组是这样一种数组,它是一种数组,它的每个元素也是包含指定元素数量的数组。
float rain[5][12]; // 内含 5 个元素的数组, 每个元素本身是一个内含12个 float 类型值的数组
  • 上述声明中 rain[5] 表明 rain 是一个内含 5 个元素的数组; float [12] 说明每个元素的类型是 float[12]

  • rain[i] 是一个内含12个 float 类型值的数组,因此该数组的首元素就是 rain[i][0],第 2 个元素是rain[0][1] ,以此类推,要访问第 i 个数组的第 j 个元素(编号从 0 开始)即为 rain[i][j]

  • 该二维视图有助于帮助读者理解二维数组的两个下标。 在计算机内部,这样的数组是按顺序储存的, 从第1个内含12个元素的数组开始, 然后是第2个内含12个元素的数组, 以此类推。

  • 遍历二维数组常用两个嵌套的 for 循环,一个循环处理数组的第1个下标, 另一个循环处理数组的第2个下标。

10.2.1 初始化二维数组

  • 初始化二维数组是建立在初始化一维数组的基础上。 首先, 初始化一维数组如下:
sometype ar1[5] = {val1, val2, val3, val4, val5};
  • 对于二维数组 rain[5][12] ,rain是一个内含 5 个元素的数组, 每个元素又是内含12个 float 类型元素的数组。 所以, 对 rain 而言, val1 应该包含 12 个值, 用于初始化内含 12 个 float 类型元素的一维数组。
const float rain[5][12] =
{ 
    {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
    {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},
    {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},
    {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},
    {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2}
};
// 使用了 5 个数值列表(花括号括起来),逗号分隔来初始化二维数组
// 第一个列表初始化第一个元素,依次类推。
  • 初始化时也可省略内部的花括号, 只保留最外面的一对花括号。
  • 如果初始化的数值不够, 则按照先后顺序逐行初始化, 直到用完所有的值。

10.2.2 其他多维数组

  • 可以把一维数组想象成一行数据, 把二维数组想象成数据表, 把三维数组想象成一叠数据表。

10.3 指针和数组

数组名是数组首元素的地址

  • 在 C 中, 指针加 1 指
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇时针分针与秒针 下一篇驱动开发:内核封装WSK网络通信接..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目