C Primer Plus学习_37数组初始化

第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]都是垃圾值。

这里可能跟编译器有关,我也说清楚,如果有人看到了,知道为什么会这样,麻烦您在评论区解答一下,感激不尽!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值