字符数组和字符串浅析

1、字符数组的定义与初始化
char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'};
char str[10]={ 'I',' ','a','m'};//其余的元素自动定为空字符(即 '\0' )

2、字符数组与字符串
在c语言中,将字符串作为字符数组来处理。(c++中不是)
字符串只能用于初始化字符数组,不可对字符数组赋值。

字符串常量如"C Program”共有9个字符,但在内存中占10个字节,结束符'\0'是系统自动加上的。(通过sizeof()函数可验证)
char str[1] = {'1'};// char str[1] = "1";会报错,字符串最后默认以'\0'结尾
char str[2] = "1"; //char str[2] = {"1"}; //char str[2] = {'1', '\0'};
字符数组不能用单个字符作为初值,必须用一个字符串(注意:字符串的两端是用双引号“”而不是单引号‘'括起来的)作为初值。此时数组的长度为(字符串长度+'\0')

char str[ ]={"I am happy"};  //可以省略花括号
char str[ ]="I am happy"; //系统自动加上结束符'\0'是
char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','\0'};
而不与下面的等价:
char str[ ]={'I',' ','a','m',' ','h','a','p','p','y'};//系统不会自动在字符串的末尾加上字符串结束符
前者的长度是11,后者的长度是10.

说明:字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0',向下面这样写是完全合法的。
char str[5]={'C','h','i','n','a'};.若str[5]不为'\0',在使用str时要注意str的真是内容。
可见,用两种不同方法初始化字符数组后得到的数组长度是不同的

3、字符串的表示形式
在C语言中,可以用两种方法表示和存放字符串:
(1)用字符数组存放一个字符串
          char str[ ]="I love China";
(2)用字符指针指向一个字符串
          char* str="I love China";

C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时只是把字符串首地址(即存放字符串的字符数组的首地址)赋给str。

4、'\0'的问题
对字符数组,有以下几种定义方法:
1)        char str[]="12345";
或给字符串加上大括号:char str[]={"12345"};
这种方法定义时,系统会自动在字符串的末尾加上字符串结束符,即 ‘\0’,
2)        char str[10]={'1','2','3','4','5'};
这种方法定义时,系统会自动从未初始化的元素开始,将之后的元素赋为\0,如上面的数组str中的元素实际上是:'1','2','3','4','5','\0','\0','\0','\0','\0'
3)        char str[]={'1','2','3','4','5'};
这种方法定义时,系统不会自动在字符串的末尾加上字符串结束符;
此时用sizeof()函数可以正确求出其所占的内存大小;但用strlen()函数不能正确求出其长度,因为strlen是通过\0判断字符串结束的。
所以,采用该方法定义时,一般人为地加上\0,即char str[]={'1','2','3','4','5', '\0'};
易错情况:
1、char a[10]; a[10]="hello";//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!
2、char a[10]; a="hello";//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!
还有:不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。
补充:
无论是静态,局部还是全局数组只有在定义时才能初始话,否则必须通过其它方法,比如循环操作实现。
任何没有在定义时初始化都是错误的!
int a[3];
static int b[3];
a[3] = {1, 2, 3};
b[3] = {1, 2, 3};

用字符指针定义时,只能采用字符串的方式初始化:char *str3="12345";
注意:字符指针可以用字符串常量初始化和赋值;
即:char *str3;str3="12345";也是可以的
此时也可以用str3[4]的形式访问其中的元素,如cout<< str3[4];就会输出str指向的字符串的第四个元素。
该方法也是自动加上了字符串结束符的。

猜你喜欢

转载自blog.csdn.net/lyl0530/article/details/80807480