第10章------数组和指针
本章介绍以下内容:
1.关键字static
2.运算符&, *(一元)
3.然后创建并初始化数组
4.指针, 指针和数字的关系
5.编写处理数组的函数
6.二维数组
数组初始化
前面介绍过的,数组由一堆相同类型的元素组成,通过声明数组来告诉编译器创建数组。
数组的声明如下:
float f[20];
char c[10];
int i[5];
诸如此类的数组声明,都代表定义了一个数组,接下来要做的是给数组初始化,让数组的值有意义。
初始化可以这样
int i[5] = {1, 2, 3, 4, 5};
当然还有好多其他方法,也都能成功初始化数组,这里就不一一列举了,毕竟全看个人喜好。
下面给出几个例程,通过简单的小程序来理解一下数组的用法。
例程一
#include <stdio.h>
#define MONTHS 12
int main(void){
int days[MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int index;
for(index = 0; index < MONTHS; index++){
printf("Month %2d has %2d days.\n", index + 1, days[index]);
}
return 0;
}
运行结果:
Month 1 has 31 days.
Month 2 has 28 days.
Month 3 has 31 days.
Month 4 has 30 days.
Month 5 has 31 days.
Month 6 has 30 days.
Month 7 has 31 days.
Month 8 has 31 days.
Month 9 has 30 days.
Month 10 has 31 days.
Month 11 has 30 days.
Month 12 has 31 days.
例程二
#include <stdio.h>
#define SIZE 4
int main (void){
int some_data[SIZE] = {43, 25}; //初始化一部分
int i;
printf("这是部分初始化\n");
printf("%2s%14s\n", "i", "some_data[i]");
for(i = 0; i < SIZE; i++)
printf("%2d%14d\n", i, some_data[i]);
return 0;
}
运行结果:
这是部分初始化
i some_data[i]
0 43
1 25
2 0
3 0
一个变量如果没有初始化,输出结果可能是一个垃圾值,同样的,数组也是如此。但是好像有点编译器是给0这个我不是很清楚,也不能乱说。通过例程2的部分初始化可以看到,部分初始化的结果是其余的数组元素都是0。
初始化其实就相当于给数组赋值,输入的时候,一个一个输也好,用for循环输也罢,都是一个赋值的过程,和变量赋值差不多。但是也不能乱输,规定了有多少个元素就是多少个,如果输入超过了那么多元素,就会造成数组越界。
假设有下面的声明:
int a[10];
那么就要确保使用数组时,下标要在0~9之内。如果超出了下标,编译器并不会报错,甚至会允许输出,可能是编译器信任写程序的人不会犯这种错误吧. . .
然后,在这里发现一个问题(我是在Dev上运行的)
例程3:
#include <stdio.h>
#define SIZE 4
int main (void){
int val1 = 44;
int val2 = 66;
int a[SIZE];
int i;
for(i = -1; i < SIZE; i++){
a[i] = 2 * i + 1;
}
for(i = -1; i < 7; i++){
printf("%2d %4d\n", i, a[i]);
}
printf("val1 = %d, val2 = %d\n", val1, val2);
printf("address of a[5]: %p\n", &a[5]);
printf("address of a[6]: %p\n", &a[6]);
printf("address of val1: %p\n", &val1);
printf("address of val2: %p\n", &val2);
return 0;
}
运行结果如下:
-1 -1
0 1
1 3
2 5
3 7
4 0
5 66
6 44
val1 = 44, val2 = 66
address of a[5]: 000000000062FE44
address of a[6]: 000000000062FE48
address of val1: 000000000062FE48
address of val2: 000000000062FE44
这里可以发现a[5]和a[6]的值,正是val1和val2的值,在内存中的地址也是一样的;然后a[-1]和a[4]也有只,只不过a[-1]的值是正确的-1,而a[4]的值却是错误的0。
这是我的电脑上运行出的结果,而书上确实另一种结果,书中是a[-1]和a[4]分别对应了val2和val1,而a[5]和a[6]都是垃圾值。
这里可能跟编译器有关,我也说清楚,如果有人看到了,知道为什么会这样,麻烦您在评论区解答一下,感激不尽!