从头学C(40)初始化

0

之前一直在提的“初始化”的概念,虽然没有系统地学习初始化,但其实我们已经知道了,在不显式初始化的情况下,

  1. 外部变量和静态变量都将被初始化为0;
  2. 而自动变量和寄存器变量的初值则没有定义(即无用的信息)。

本章节,就来仔细看看存储类的初始化规则。

第四章 函数与程序结构 >> 4.9 初始化

定义变量时,可以在变量名后紧跟一个等号和一个表达式来初始化该变量:

int x = 1;
char squota = '\'';
long day = 1000L * 60 * 60 * 24L; /* milliseconds/day */

1. 外部变量的初始化

对于外部变量、静态变量来说,初始化表达式必须是常量表达式,且只初始化一次(严格来说是在程序开始执行前进行初始化)。

2. 自动变量的初始化

对于自动变量、寄存器变量来说,初始化表达式可以不是常量表达式(可以包含任意在此表达式之前已经定义的值,或者函数调用),而且在每次进入函数或程序块时,都会被初始化。

自动变量的初始化等效于简写的赋值语句,比如可以用下面这种形式:

int binsearch(int x, int v[], int n)
{
        int low = 0;
        int high = n - 1;
        int mid;
}

代替原来的:

int low, high, mid;

low = 0;
high = n - 1;

3. 数组初始化

数组的初始化可以在声明的后面紧跟一个初始化表达式列表。初始化表达式列表用花括号括起来,内部各表达式用逗号分隔,例如:

int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

当数组长度省略时,编译器会把初始化列表中的表达式个数作为数组长度(上例为 12)。

如果声明数组时指定了数组长度,

  1. 若表达式列表中的表达式个数小于数组长度,则对外部变量、静态变量、自动变量来说,没有初始化表达式的元素将被初始化为0;
  2. 若表达式列表中的表达式个数大于数组长度,这是错误的,编译器会报错。

字符数组的初始化比较特殊,它接受一个字符串形式的表达式序列:

char pattern[] = "ould";

其实等价于:

char pattern[] = {'o', 'u', 'l', 'd'};

特别提醒,此处的数组长度为 5 ,因为要一个额外的空间存放字符串结束符’\0’。

Leave A Reply