首页 > 代码库 > 第五章 数组(1):数组声明和初始化

第五章 数组(1):数组声明和初始化

搞了一年多的android ,现在又回到c语言了,最基础的都不知道了,今天声明数据居然还用变量做大小,罪过啊


数组(array)是若干同类变量的聚合,允许通过统一的名字引用其中的变量。其特定元素通过下标(index)访问。C语言的数组由连续的内存区构成,最低地址对应首元素,最高地址对应末元素。

保存数组所需要的内存量直接与基类型和数组大小有关。对一维数组而言,以字节为单位的总内存量可以这样来确定:

       总字节数  sizeof (基类型)×数组长度

例如,一维数组x

int x[100];

所占内存字节数目为sizeof(int)×1004×100400个字节数。它在内存中排列如下:

元素 x[0]      x[1]       x[2]   ...    x[98]      x[99]     

地址 0x004000  0x004004   0x004008...   0x004260   0x004264   0x004268

       可见,一维数组就是在连续内存中按下标顺序存储的同类信息组成的表。

       C语言中,框住下标的方括号([])实际上被看成一个运算符,与圆括号(())具有相同的优先级。下表归纳了一些运算符的优先级(从上到下递减):

      

      

   

() []

从左到右

最高

++  --  !(type)

从右到左

单目运算符

* / %

从左到右

乘除运算符

+  -

从左到右

加减运算符

<  <=  >  >=

从左到右

关系运算符

==  !=

从左到右

相等测试运算符

&&

从左到右

逻辑与

||

从左到右

逻辑或

? :

从右到左

条件运算符

=  +=  -=  *=  /+  %=

从右到左

赋值运算符

,

从左到右

逗号运算符

 

       C语言中最常用的数组是串(string),它是以空(null)字符结束的一位字符数组。

 

5.1数组声明和初始化

一维数组的定义形式:

    type var_name[size];

       这里,type定义了数组的基类型(base-type),即数组中各元素的类型。size定义了数组的元素数目。C89规定,必须用常数指定数组的大小。如:

    double balance[100];

       数组通过下标引用数组名来访问它的元素。如:

       balance[13] = 12.34; /* balance3号元素赋值 */

       注意,C语言的数组的首元素的下标是0

       示例:加载由099组成的一个整型数组。

1   #include <stdio.h>

2

3   int main(void)

4   {

5       int x[100];   /* 定义一个100元素的整型数组 */

6       int t;

7

8       /* 初始数组x,其值从099 */

9       for ( t=0; t<100; ++t ) x[t] = t;

10

11      /* 显示x100 */

12     printf( "Index\tValue\n", x[t] );

13      fort=0; t<100; ++t ) printf( "%d\t%d\n", tx[t] );

14

15      return 0;

16  }

数组在声明时,其各个元素的值是随机的,可以在数组声明时初始化它,如例子中的第五行

5       int x[100];

可以这样来写以初始化:

5       int x[100]  { 0 };

这表示数组x的首个元素被初始化为0,由于初始化值的个数比数组元素个数少,因此其余的99个元素都被自动初始化为0。也可以这样为数组初始化:

        int y[5]  { 33, 2, 0, 6, 54 };

这样就为一个五个元素的整型数组初始化全部值。但下面的做法是错误(语法错误):

int y[5]  { 33, 2, 0, 6, 54, 45 };

由于声明为数组只有五个元素,因此初始化的值也只能小于等于五。

       有时,如果声明数组的同时初始化它,可以省略声明的数组的大小,其元素个数由初始化值的列表数目确定:

              int y[]  { 33, 2, 0, 6, 54 };

这是一个具有五个元素的数组。

注意C语言不检查数组的边界,因此程序可以在数组的两边越界。如上例第九行可以这样写,尽管这导致溢出:

for ( t=0; t<=100; ++t ) x[t] = t;

这时, x[100] = 100已经越界,这可以通过编译,运行时也不一定会发生错误。程序员必须在必要时加入边界检查。

 

5.2 数组指针和数组作为函数参数

       直接引用数组名字而不用下标,就可以产生指向数组首元素的指针,不需要用取地址符号&。如:

int *ptr;

ptr = x; /* 无需&x[0] */


第五章 数组(1):数组声明和初始化