搞了一年多的android ,现在又回到c语言了,最基础的都不知道了,今天声明数据居然还用变量做大小,罪过啊
数组(array)是若干同类变量的聚合,允许通过统一的名字引用其中的变量。其特定元素通过下标(index)访问。C语言的数组由连续的内存区构成,最低地址对应首元素,最高地址对应末元素。
保存数组所需要的内存量直接与基类型和数组大小有关。对一维数组而言,以字节为单位的总内存量可以这样来确定:
总字节数 = sizeof (基类型)×数组长度
例如,一维数组x
int x[100];
它所占内存字节数目为 sizeof (int) × 100 = 4 × 100 = 400 个字节数。它在内存中排列如下:
元素 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; /* 为balance的3号元素赋值 */
注意,C语言的数组的首元素的下标是0。
示例:加载由0~99组成的一个整型数组。
1 #include <stdio.h>
2
3 int main(void)
4 {
5 int x[100]; /* 定义一个100元素的整型数组 */
6 int t;
7
8 /* 初始数组x,其值从0到99 */
9 for ( t=0; t<100; ++t ) x[t] = t;
10
11 /* 显示x,100行 */
12 printf( "Index\tValue\n", x[t] );
13 for( t=0; t<100; ++t ) printf( "%d\t%d\n", t, x[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] */