8.1.1数组下标
a[i]中的 a是数组名, i 是整数值 , [i]对数组a取下标 或 进行索引 , a[0]数组元素
T类型
数组和for循环结合使用
scanf函数读取a[0] 需用&
a[0]数组从下标0开始 但是a[10]这个元素并不存在
数组下标可以是表达式,表达式可以有副作用 下标尽量不要有副作用就能避免问题发生: |
为了存取特定的数组元素,可以在写数组名的同时在后边加上一个用方括号围绕的整数值(称这是对数组取下标)或进行索引。数组元素始终从0开始,所以长度为n的数组元素的索引是从0到n-1.例如,如果a是含有10个元素的数组,那么这些元素可以如下所示一次标记为a[0],a[1]..a[9];
形如a[i]的表达式是左值,所以数组元素可以像普通变量一样使用: a[0] = 1; printf("%d\n", a[5]); ++a[i]; 一般说来,如果数组包含T类型的元素,那么数组中的每个元素均视为T类型的变量。本例中,a[0]、a[5]和a[i]可以看作int类型变量。 数组和for循环结合在一起使用。许多程序所包含的for循环都是为了对数组中的每个元素执行一些操作。下面给出了在长度为N的数组a上的一些常见操作示例。 for(i = 0; i<N; i++) a[i] = 0; /*clears a*/
for(i = 0; i < N; i++) scanf("%d", &a[i]);/*reads data into a*/
for(i = 0; i< N; i++) sum += a[i]; /*sums the elements of a*/ 注意,在调用scanf函数读取数组元素时,就像对待普通变量一样,必须使用取地址符号& C语言不要求检查下标的范围。当下标超出范围时,程序可能执行不可预知的行为。下标超出范围的原因之一是:忘记了n元数组的索引是从0到n -1,而不是从1到n。下面的例子给出了由这种常见错误导致的奇异效果: int a[10], i; for (i = 1; i <= 10; i++) a[i] = 0; 对于某些编译器来说,这个表面上正确的for语句却产生了一个无限循环!当变量 i 的值变为10时,程序将数值0存储在a[10]中。但是a[10]这个元素并不存在,所以在元素a[9]后数值0立刻进入内存。如果内存中变量 i 放置在a[9]的后面,那么变量 i 将会被重置为0,进而导致循环重新开始。 数组下标可以是任何整数表达式: a[i + j * 10] = 0; 表达式甚至会有副作用: i = 0; while(i < N) a[i++] = 0; 在把变量 i 设置为0后,while语句判断变量 i 是否小于N。如果是,那么将数值0赋值给a[0],随后 i 自增,然后重复循环。注意,a[++i]是不正确的,因为第一次循环体执行期间将会把0赋值给a[1]。 当数组下标有副作用时一定要注意。例如,下面这个循环想把数组b中的元素复制到数组a中,但它可能无法正常工作: i = 0; while(i < N) a[i] = b[i++]; 表达式a[i] = b[i++]访问并修改 i 的值,如4.4节所述,这样会导致未定义的行为。当然,通过从下标中移走自增操作可以很容易避免此类问题的发生: for (i = 0; i< N; i++) a[i] = b[i];
数列反向 #define N 10 int main(void) { int a[N], i; printf("Enter %d numbers:", N); for(i = 0; i<N; i++) scanf("%d", &a[i]); printf("In reverse order: "); for(i = N - 1; i>=0; i--) printf(" %d", a[i]); printf("\n"); } 这个程序说明了宏和数组联合使用可以多么有效。程序一共4次使用到了宏N:在数组a的声明中,在显示提示的printf函数中,还有两个for循环中,如果以后需要改变数组的大小,只需要编辑N的定义并且重新编译程序就可以了,其他声明也不需要改变,甚至连提示也仍然是正确的。 |
a[i]中的 a是数组名, i 是整数值 , [i]对数组a取下标 或 进行索引 , a[0]数组元素 但是a[10]这个元素并不存在这句是什么意思。 |