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]这个元素并不存在这句是什么意思。

posted @ 2021-04-26 08:59  Sai佐为  阅读(803)  评论(0)    收藏  举报