推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

C/C++编程笔记:C 语言字符数组的定义与初始化,讲解到位

   2023-06-30 网络整理佚名960
核心提示:1、字符数组的定义与初始化注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的。4、对使用字符指针变量和字符数组两种方法表示字符串的讨论4、如果定义了一个字符数组,那么它有确定的内存地址;而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。

1.字符数组的定义和初始

初始化字符数组的最简单方法是将字符分配给数组中的每个元素。

char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y'};

即为str[0]到str[9]的10个元素分配10个字符

如果大括号中提供的字符数大于数组的长度,则会被视为语法错误; 如果小于数组长度,则仅设置字符数组中的第一个元素,其余元素将自动设置为空字符(即 '\0' )。

2. 字符数组和字符串

在C语言中,字符串被视为字符数组。 (c++ 中没有)

在实际应用中,人们关心的是有效字符串的长度而不是字符数组的长度。 例如,定义一个字符数组的长度为100,但实际有效字符只有40个,为了确定字符串的实际长度,C语言规定了一个“字符串结束标志”,用字符'来表示\0'。 如果有一个字符串,第10个字符是'\0',则该字符串的有效字符为9个。也就是说,当遇到第一个字符'\0'时,表示字符串结束,而形成之前的字符串。

系统还会自动在字符串常量中添加“\0”作为终止符。 例如“C”总共有9个字符,但在内存中占用了10个字节,最后一个字节'\0'是系统自动添加的。 (可以通过()函数验证)有了结束标志'\0',字符数组的长度就不再那么重要了。 在程序中,常常通过检测'\0'的位置来判断字符串是否结束,而不是根据数组的长度来判断字符串长度。

当然,在定义字符数组时,应该预估实际的字符串长度,以保证数组长度始终大于实际的字符串长度。 (在实际的字符串定义中,往往不指定数组的长度,如char str[])说明:'\n'代表ASCII码为0的字符,从ASCII码表可以发现: ASCII 码为 0 的字符不是可以显示的字符,而是“空运算符”,即不执行任何操作。 用它作为字符串的结尾,不会产生额外的操作,也不会增加有效字符,只是一个识别的标志。

上面了解了C语言处理字符串的方法之后,在字符数组初始化的方法中再增加一个方法——那就是可以使用字符串常量来初始化字符数组:

char str[ ]={"我很高兴"}; 大括号可以省略,如下图

char str[ ]="我很高兴";

注意:上面对字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值。 字符数组的赋值只能为其元素一一赋值。 下面的赋值方法是错误的。

字符str[];

str="我很高兴";

不要使用单个字符作为初始值,而是使用字符串(注意:字符串两端用双引号“”括起来,而不是单引号'')作为初始值。 显然,这种方法更加直观、方便。 (注意:数组str的长度不是10,而是11。请记住这一点,因为系统会自动在字符串常量“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'};

++++++++

可以看到,两种不同的方法初始化字符数组后得到的数组长度是不同的。

#

无效主(无效)

{

char c1[]={'I','','a','m','','h','a','p','p','y'};

char c2[]="我很高兴";

int i1=(c1);

int i2=(c2);

("%d\n",i1);

("%d\n",i2);

}

结果:10 11

3.字符串的表示

在C语言中,字符串可以用两种方式表示和存储:

(1)使用字符数组存储字符串

char str[ ]="我爱中国";

(2) 使用字符指针指向字符串

char* str="我爱中国";

对于第二种表达方式,有人认为str是字符串变量,认为字符串常量“我爱中国”在定义时就直接赋值给字符串变量,这是错误的。

C 语言将字符串常量视为字符数组。 在内存中创建一个字符数组来存储字符串常量。 当程序定义字符串指针变量str(数组的首地址)时,赋值给str。

两种表示的字符串输出都使用("%s\n", str);

%s表示输出一个字符串,给定字符指针变量名str(对于第一种表示方法,字符数组名就是字符数组的首地址,与第二种方法中的指针含义一致),则系统首先输出它所指向的一个字符数据,然后自动增加str,使其指向下一个字符……,以此类推,直到遇到字符串结束标识符“\0”。

4.使用字符指针变量和字符数组表示字符串的讨论

虽然字符数组和字符指针变量都可以用来存储和操作字符串,但是两者的区别

存在差异,不应混淆。

4.1. 字符数组由若干个元素组成,每个元素包含一个字符; 而字符指针变量存储的是地址(字符串/字符数组的首地址),绝对不要把字符串放入字符指针变量中(是字符串起始地址)

4.2. 分配方法:

只能给字符数组的每个元素赋值,不能使用以下方法给字符数组赋值

字符str[14];

str="我爱中国"; (但是字符数组初始化的时候是可以的,即char str[14]="I love China";)

对于字符指针变量,可以使用以下方法来赋值:

字符*一个;

a=“我爱中国”;

或者 char* a="我爱中国"; 两个都很好

4.3. 给字符指针变量赋一个初始值(初始化):

char* a="我爱中国";

相当于:

字符*一个;

a=“我爱中国”;

以及用于字符数组的初始化

char str[14]="我爱中国";

不能等同于:

字符str[14];

str="我爱中国"; (这不是初始化,而是赋值,并且这个赋值给数组

值错误)

4.4. 如果定义了字符数组,那么它就有明确的内存地址; 而字符指针变量定义时并不指向确定的字符数据,可以多次赋值。

5.字符串处理函数

5.1

char *(char *str1, const char *2 );

char *(char *, const char * );

功能:该函数将字符串str2连接到str1的末尾,并返回指针str1

注意:连接的前两个字符串后面有一个'\0',连接时去掉字符串1后面的'\0',只保留新字符串末尾的'\0'

5.2

char *(char *str1, const char *2 );

char *(char *, const char * );

功能:将字符串中的字符复制到字符串中,包括空终止符。 返回值是一个指针。

笔记:

1、“字符数组1”必须写成数组名的形式,“字符串2”可以是字符数组名,也可以是字符串常量

2、复制时与字符串后面的'\0'一起复制到数组1

3、不能直接用赋值语句将字符串常量或字符数组赋值给字符数组(和普通变量数组一样),只能用函数来处理。

4. 可以使用该函数将字符串2中的前几个字符复制到字符数组1中。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON