什么是字符数组
字符数组使用字符的形式保存数组(实质上就是将单个字符利用数组的方式保存起来)
数组:采用int,float,double类型初始化
字符数组:采用char类型初始化
int i[]={1,2,3}; char ch[]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘};
字符数组与字符串的区别
我们通常意义上说的字符串是类似于“hello”这样用双引号引起来的字符集。二者的区别主要集中在定义和赋值上。
在C中对字符串并没有明确的划分,一般使用字符数组来初始化字符串并赋值。即
char ch[]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘}
如果我们要定义一个多维字符数组,那么我们需要这样做
char ch[3][10]={"hello","my","love"}
显然这样的方式在多维字符串的定义赋值中过于繁琐,为此C++中提出了一个替代方案,即使用string类型专指字符串,将二者区分开来。string不同于char,char与int,float,double等是基础类型,在程序中具有固定的长度,而string属于模板类型(Class类),在C#中称其为引用类型,它本身并不像char一般具有固定长度,它的长度取决于引用的内存中字符串的长度。
上述实例我们重新用string类型赋值如下
string str="hello my love"
显然与上例相比程序的可读性被增强。关于string还有一些方法和属性便于更快捷的使用字符串,将在以后的文章中专门讲解,这里不再赘述。
字符数组赋值
字符数组的赋值要求直接在字符数组定义后面执行,有如下几种方式
1 char ch1[]="hello"; 2 char ch2[6]="hello"; 3 char ch3[5]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘}; 4 char ch4[]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘}; 5 char *ch5="hello"; //此为字符指针赋值
特别提醒:直接用字符串赋值数组长度应为字符串长度+1(字符串后面以\0结尾)
注意:字符数组不能直接赋值!!!诸如
char ch[5];ch[5]="hello"是不合法的
字符指针和字符数组的区别
对比上述赋值方式,前四个为字符数组赋值,相当于开辟若干内存空间,每一个字符依次指向每一个内存空间。第五个是字符指针赋值,相当于开辟若干空间存入字符串,然后让字符指针指向首位内存地址。由于字符指针指向的是内存地址,而字符数组直接指向内存中的内容,因此前者支持直接赋值,而后者不行
char *ch; ch="hello"; //这是合法的 char ch[5]; ch="hello"; //这是不合法的
关于‘\0’
以前上课的时候老师曾经讲过,字符串(字符数组)以‘\0‘结尾,在此特别加以说明:
‘\0‘由程序自动填充,其作用有两个:(1)用于标记字符串结束;(2)用于填充位,详细如下
1 char ch1[]="hello"; //字符串内自动填充‘\0‘ 2 char ch2[6]="hello"; //相当于{‘h‘,‘e‘,‘l‘,‘l‘,‘o‘,‘\0‘} 3 char ch3[5]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘}; //五位字符全部被占用,没有‘\0‘ 4 char ch4[7]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘}; //存在两位空位,填充两个‘\0‘ 5 char ch5[]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘}; //动态分配内存,没有‘\0‘
由于程序运行时如果字符数组内不存在‘\0‘终止符,有可能会造成内存溢出,使程序中断,因此赋值时需要注意