C语言数组

数组

一维数组

定义一维数组

定义一维数组的一般形式:

	    	类型符 数组名 [常量表达式];

其中:

  • 数组名的命名规则和变量名相同,遵循标识符命名规则。
  • 常量表达式的值表示数组中元素的个数,也称为数组的长度。
  • 常量表达式可以包含常量、const 变量和符号常量,但不能包含变量。

数组下标

为了存取特定的数组元素,可以在写数组名的同时在后边加上一个用方括号围绕的整数值(称这是对数组取下标或进行索引)。
数组元素的一般形式为:

		        数组名[下标]

其中,下标只能为整型常量或整型表达式。
数组元素始终从 0 开始,所以长度为 n 的数组元素的索引是从 0 到 n-1。
在声明数组并对其中各元素赋值后,就可以引用数组中的元素。
数组元素可以像普通变量一样使用。

int a[10]; //整型数组,数组名为 a,包含 10 个整型元素。
int i = 2;
a[0] = 1;  //数组首个元素赋值,值为 1 
a[9] = i;  //数组最后一个元素值为 2 
int j = a[0]; //数组元素赋予变量 j 

一般说来,如果数组包含 T 类型的元素,那么数组中的每个元素均视为 T 类型的变量。
注意:只能引用数组元素而不能一次整体调用整个数组全部元素的值。

int a[10]; //未初始化的数组
/*逐个数组元素赋值*/
for (int i = 0; i < 10; ++i)
{
    a[i] = i + 1;
}
/*遍历数组*/
for (int i = 0; i < 10; ++i)
{
    printf("%d ", a[i]);
}

一维数组的初始化

数组的初始化可以用初始化列表(以下)的方式实现。
数组中各元素的初值顺序放在一对花括号内,数据间用逗号分隔。

  1. 在定义数组时对全部数组元素赋予初值。
    例:int a[5] = {1,2,3,4,5};
  2. 可以只对一部分元素赋值,剩余未被赋予初值的元素赋予默认值0。
    例:int a[5] = {1,2,3}; //等价于int a[5] = {1,2,3,0,0};
  3. 数组初始化为0。
    例:int a[5] = {0}
  4. 在对全部数组元素赋初值时,可以不指定数组长度,系统自动定长。
    例:int a[] = [1,2,3,4,5];
    如果想要的数组长度与提供的初值个数不相同,则数组长度不能省略。

指定初始化

C99允许数组指定初始化:

int a[10] = {[1] = 9,[3] = 10,[5] = 6};//数组元素1为9,元素3为10,元素5为6,其余元素为0。

中括号中的数字称为指示符。
指示符必须是整型常量表达式。
如果待初始化的数组长度为 n,则每个指示符的值都必须在 0 和 n-1 之间。
如果数组的长度是省略的,指示符可以是任意非负整数。
对于有指示符情况,编译器将根据最大的指示符推断出数组的长度。

int a[] = {[1] = 11,[9] = 10,[5] = 6}; //指示符最大值是9,因此数组长度为10

初始化式中可以同时使用老方法(逐个元素初始化)和新方法(指定初始化式):

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

二维数组

声明二维数组

声明二维数组的一般形式是:

	类型说明符 数组名[常量表达式 1][常量表达式 2]

其中:
常量表达式 1 表示第一维下标的长度,表示“行”。
常量表达式 2 表示第二维下标的长度,表示“列”。
C语言对二维数组采用这样的定义方式,使得二维数组可被看作是一种特殊的一维数组:它的元素又是一个一维数组。
例,声明一个二维数组:

int a[3][4];

可以把 a 看作是一个一维数组,它有3个元素:a[0],a[l],a[2]
每个元素又是一个包含4个元素的一维数组:

	a[0] ------ a[0][0] a[0][1] a[0][2] a[0][3]
	a[l] ------ a[l][O] a[1][1] a[1][2] a[1][3]
	a[2] ------ a[2][0] a[2][l] a[2][2] a[2][3]

必须强调的是,a[0],a[l],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。
注意:用矩阵形式(如3行4列形式)表示二维数组,是逻辑上的概念,能形象地表示出行列关系;在内存中,各元素是按行连续存放的,是线性的。

二维数组的下标

二维数组下标的一般形式:

				数组名[下标][下标]

其中,下标应为整型常量或整型表达式。
数组元素是左值,可以出现在表达式中,也可以被赋值。

二维数组的初始化

  1. 二维数组可以按行分段赋初值。
    例:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; //按行分段赋初值
  2. 二维数组可以按行连续赋初值。
    例:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; //连续赋初值
  3. 二维数组可只对部分元素赋初值,后面未赋初值的元素自动取 0 值。
    例1:int a[3][4]={{1},{0,5},{0,11}}; //省略行内元素
    例2:int a[3][4]={{1},{},{11}}; //省略行
  4. 全部元素赋初值,则第1维的长度(行数)可以省略,但第 2 维的长度(列数)可以不能省。
    例1:int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12}; //连续赋初值
    例2:int a[][4]={{1},{},{11}}; //省略行

C99的指定初始化式对多维数组也有效。

int [2][2] = { [0][0] = 1,[1][0] = 5 };

没有指定值的元素都默认置为0。

常量数组

无论一维数组还是多维数组,都可以通过在声明的最开始处加上单词 const 而成为"常量":

const char hex_chars[] = {'A','B','C','D','E'};

程序不应该对声明为 const 的数组进行修改,编译器能够检测到直接修改某个元素的意图。

变长数组

数组变量的长度必须用常量表达式进行定义;但是在C99中,有时候也可以使用非常量表达式。

int a[n];

变长数组的长度不一定要用变量来指定,可以是任意表达式(可以含有运算符)。

int a[3 * i + 5];

变长数组(variable-length array 简称 VLA )的长度是在程序执行时计算的,而不是在程序编译时计算的。
变长数组的主要限制是它们没有静态存储期限,另一个限制是变长数组没有初始化式。

你可能感兴趣的:(C语言,c语言,数组)