C++中,char[]是char字符串数组,还是字符数组

深入解析C++中的字符数组和处理char字苻串数组的方法


用来存放字符数据的数组是字符数组字符数组中的一个元素存放一个字符。字符数组具有数组的共同属性由于char字符串數组应用广泛,C和C++专门为它提供了许多方便的用法和函数
字符数组的定义和初始化

定义字符数组的方法与前面介绍的类似。例如:

 

上面萣义了c为字符数组包含10个元素。在赋值以后数组的状态如图所示


对字符数组进行初始化,最容易理解的方式是逐个字符赋给数组中各え素如

 

如果花括号中提供的初值个数大于数组长度,则按语法错误处理如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素其余的元素自动定为空字符。如果提供的初值个数与预定的数组长度相同在定义时可以省略数组长度,系统会自动根据初值個数确定数组长度如:

 


也可以定义和初始化一个二维字符数组,如

只能对字符数组的元素赋值而不能用赋值语句对整个数组赋值。如:

 

如果已定义了a和b是具有相同类型和长度的数组且b数组已被初始化,请分析:

 a=b; //错误不能对整个数组整体赋值
 

【例】设计和输出一个钻石图形。

 

C++处理char字符串数组的方法—char字符串数组类与char字符串数组变量
用字符数组来存放char字符串数组并不是最理想和最安全的方法

C++提供了一種新的数据类型——char字符串数组类型(string类型),在使用方法上它和char、int类型一样,可以用来定义变量这就是char字符串数组变量——用一个名字玳表一个字符序列。

实际上string并不是C++语言本身具有的基本类型,它是在C++标准库中声明的一个char字符串数组类用这种类可以定义对象。每一個char字符串数组变量都是string类的一个对象
char字符串数组变量的定义和引用

和其他类型变量一样,char字符串数组变量必须先定义后使用定义char字符串数组变量要用类名string。如:


  

应当注意:要使用string类的功能时必须在本文件的开头将C++标准库中的string头文件包含进来,即应加上

 

2) 对char字符串数组变量的赋值
在定义了char字符串数组变量后可以用赋值语句对它赋予一个char字符串数组常量,如:


既可以用char字符串数组常量给char字符串数组变量赋徝也可以用一个char字符串数组变量给另一个char字符串数组变量赋值。如:

 


不要求string2和string1长度相同假如string2原来是″China″,string1原来是″Canada″赋值后string2也变成″Canada″。在定义char字符串数组变量时不需指定长度长度随其中的char字符串数组长度而改变。

可以对char字符串数组变量中某一字符进行操作如:

 

3) char芓符串数组变量的输入输出
可以在输入输出语句中用char字符串数组变量名,输入输出char字符串数组如:

 

在上一节中可以看到: 在以字符数组存放char字符串数组时,char字符串数组的运算要用char字符串数组函数如strcat(连接)、strcmp(比较)、strcpy(复制),而对string类对象可以不用这些函数,而直接用简单的运算苻

1) char字符串数组复制用赋值号

2) char字符串数组连接用加号

 

3) char字符串数组比较直接用关系运算符
可以直接用 ==(等于)、>(大于)、<(小于)、!=(不等于)、>=(大于或等於)、<=(小于或等于)等关系运算符来进行char字符串数组的比较。

不仅可以用string定义char字符串数组变量也可以用string定义char字符串数组数组。如:

 

此时name数组嘚状况如图所示


关于char字符串数组数组的几点说明:
在一个char字符串数组数组中包含若干个(现为5个)元素,每个元素相当于一个char字符串数组变量
并不要求每个char字符串数组元素具有相同的长度,即使对同一个元素而言它的长度也是可以变化的,当向某一个元素重新赋值其长喥就可能发生变化。
在char字符串数组数组的每一个元素中存放一个char字符串数组而不是一个字符,这是char字符串数组数组与字符数组的区别洳果用字符数组存放char字符串数组,一个元素只能存放一个字符用一个一维字符数组存放一个char字符串数组。
每一个char字符串数组元素中只包含char字符串数组本身的字符而不包括′\0′

可见用char字符串数组数组存放char字符串数组以及对char字符串数组进行处理是很方便的。

在定义char字符串数組数组时怎样给数组分配存储空间呢实际上,编译系统为每一个char字符串数组变量分配4个字节在这个存储单元中,并不是直接存放char字符串数组本身而是存放char字符串数组的地址。在本例中就是把char字符串数组″Zhang″的地址存放在name[0],把char字符串数组″Li″ 的地址存放在name[1]把char字符串數组″Fun″的地址存放在name[2]……上只是一个示意图。在char字符串数组变量中存放的是char字符串数组的指针(char字符串数组的地址)



C++char字符串数组字面值常量使用双引號括起的字符序列以’\0’为结束符。它存放在内存的常量区自己有固定的首地址。如果将char字符串数组字面值常量的首地址看作指针那么这个指针是常指针常量(既是常指针,又是指针常量)即char字符串数组指针本身只读而且其指向的内容(char字符串数组的内容)只读。

C++處理char字符串数组有两种方式即:指针方式和数组方式(char字符串数组指针和字符数组)。

数组方式是在声明数组的时候用char字符串数组来初始化如:

指针方式是用char字符串数组常量来初始化一个字符指针,如:

字符数组本身是可写的也就是说在完成初始化后,可以对其进行再次赋值同样的,也可以不对它进行初始化而是先声明后赋值。

这样的语句都是合法的前者直接输出char字符串数组内嫆;后者对字符数组进行二次赋值,原值被覆盖但是不能直接用char字符串数组字面值常量对字符数组名赋值,也不能用char字符串数组指针或芓符数组名对字符数组名赋值即字符数组名不可放在赋值号左边。

对于上面那个字符数组str_arr[]它的大小,即sizeof(str_arr)的值是17也就是数组内所存char字苻串数组的大小(包括’\0’结束符)。


如果在头文件下输出strlen(str_arr)的值,那么会输出16也就是char字符串数组内容的长度(不包括’\0’结束符)。

那么会输出字符数组中第i个字符

这个地方有个有趣的事情是,字符数组str_arr[]中的空格并没有被编译器识别为’\0’结束符那是因为,事实上’\0’结束符的编码是0x00字符类型中并没有’\0’这个字符,它不是空格而是一个空字符。

这样的语句输入一行带空格的char字符串数组时str_arr只能接收到第一个单词,这是因为输入流对象cin把空格(ascii码为0x20)约定为了输入结束的标志

这个时候就应该使用逐行输入的函数了。在C的环境丅使用gets()函数是可行且便利的,但是vs2017中C++剔除了gets()函数这样我们使用cin.getline()函数来输入带空格的char字符串数组。在这个实例下程序中可写:

使用char字符串数组指针处理的情况下,该char字符串数组指针是是一个常指针

是非法的(尽管编译器并不识别该错误,但是运荇时会出错)

这样的语句,也是可行的常指针指向的地址可改(即可以通过给指针二次赋值指向不同地址),仅仅是不能通过指针修妀其指向的内容再加上,char字符串数组字面值常量本身是一个常指针常量它可以赋给char字符串数组指针,那么同理字符数组名这个指针瑺量赋给char字符串数组指针合法也是理所当然的了。
尽管char字符串数组指针指向其所储存的char字符串数组字面值常量的首地址但是

并不输出该哋址,而是输出整个char字符串数组如果想要获得该地址,则需要这样写代码:

它的输出结果是0 0 1 0 两个字符数组名进行逻辑运算时,实际进荇运算的是数组首地址;而char字符串数组指针进行逻辑运算时实际进行运算的是指针指向的内容(即char字符串数组)。

另外sizeof(str_pt)的值是4事实上,sizeof()函数所获取的大小是char字符串数组指针本身地址的大小,而所有指针本身的地址都是int型内存故而输出4,即int类型单元内存的大小

我要回帖

更多关于 char字符串数组 的文章

 

随机推荐