字符数组初始化和'/0'

时间:2021-11-26 19:51:05

 

字符数组可以在定义时进行初始化.有两种初始化方法.

方法1:逐个字符赋给数组中各元素.这种方法最容易理解.例如:

char c[5]={ 'H','a','p','p','y' };
把5个字符分别赋给c[0]至c[4].以下是几点说明
:

(1) 如果大括号内提供的初值个数(即字符个数)大于数组长度,则编译时将出错.如果初值个数小于数组长度,则只将这些字符赋给前面的数组元素,其余的元素自动赋空字符(即'/0').例如:

引用:
char c[10]={ 'h','e','l','l','o' };

数组状态如下所示:

 

引用:
c[0]=h , c[1]=e , c[2]=l , c[3]=l , c[4]=o
c[5]=/0, c[6]=/0, c[7]=/0, c[8]=/0, c[9]=/0

(2) 如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值字符个数决定数组大小.如:

引用:
char c[]={ 'p','r','o','g','r','a','m' };
数组长度自动定义为7.此方法可省略逐个去数字符的个数,对多字符赋值比较方便.

(3) 也可以给多维数组初始化.如下初始化二维数组的例子:

引用:
char trinangle[3][5]={ { ' ',' ','o' },{ ' ','o','o','o' },{ 'o','o','o','o','o' } };
trinangle数组中存放的是一个三角形的图形,如:

引用:
o
ooo
ooooo

下面来看一个例子:

引用:
main() /*输出如上三角形*/
{
char trinangle[3][5]={ { ' ',' ','o' },{ ' ','o','o','o' },{ 'o','o','o','o','o' } };
int i,j;
for(i=0;i<=2;i++) /*外层列循环*/
{
for(j=0;j<=4;j++) /*内层行循环*/
printf("%c",trinangle[i][j]);
printf("/n"); /*每循环一次,换行一次*/
}
}

方法2:用字符串常量来给字符数组初始化.例如:

引用:
char c[]={ "Good idea" };
这时,编译计算出该数组的大小为10.为什么不是9呢?因为编译程序在扫描整个字符串的时候,自动在该串末尾加上'/0'字符,以表示字符串到此结束,并把它一起存入字符数组中.这点请务必注意.因此,上面的初始化与下面的初始化等价:

引用:
char c[]={ 'G','o','o','d',' ','i','d','e','a','/0' };
而不与以下写法等价:

引用:
char c[]={ 'G','o','o','d',' ','i','d','e','a' };
前者长度为10,后者长度为9.

引用:
小提示:'/0'代表ASCII码为0的字符,它是一个"空操作符",即使什么也不做.C语言用它来作为字符串结束标志,作用是便于测定字符串的实际长度,例如有一个字符串,其中第10个字符为'/0'则此字符串的有效字符为9个.也就是说,在遇到字符'/0'时,表示字符串结束,由它前面的字符组成字符串实际长度.
系统在字符串常量末尾自动加一个'/0'作为结束符.例如"I am a student"共要14个字符,但在内存中占15个字节,最后一个字节'/0'是由系统自动加上的.字符串作为一维数组存放在内存中.需要指出的是:字符数组并不要求它的最后一个字符为'/0',甚至可以不包含'/0'.例如以下两种写法都是合法的:

引用:
char c[4]={ 'L','O','V','E' };

char c[4]={ "LOVE" };

但是为了使处理方法一致,便于测定字符串的实际长度,以及在程序中作相应的处理,在字符数组也常常人为地加上一个'/0'.如:

引用:
char c[5]={ 'L','O','V','E','/0' };
C语言允许在初始化一个一维字符数组时,省略字符串常量外面的大括号.例如:

引用:
char c[]={ "I love China" };
可直接写成:

引用:
char c[]="I love China";
这种方法清晰直观,符合人们的习惯.但注意,在省略大括号的时候,不能用单个字符作(用单引号括起来的)为初值,而是用一个字符串(用双引号括起来的)作为初值.也就是说,用方法一初始化时,不能省略大括号;只有在用方法二初始化时才可以省略大括号。如下写法是错误的:

引用:
char c[]='I';
多维数组初始化时,推荐使用以下形式直接赋给它多个字符串.例如:

引用:
char str[4][8]={ "father","mother","brother","sister" };