c++如何打印一维数组首地址_C语言学习|简单的介绍字符数组

f82a58024f2198924f8612cf756f3e26.png

字符串数组与字符串的关系

字符串是由若干有效字符构成且以字符'0'作为结束标志的一个字符序列。

字符串常量是用一对双引号括起来的一串字符,如“happy”。其中'0'作为字符串的结束标志,在这里可不显式输出,C编译程序自动在其尾部自动添加字符'0'。

C语言中只提供了字符数据类型,没有提供字符串数据类型,C语言中的字符串是通过字符数据来实现的,所有表示字符串的字符数组的最后一个元素都是空字符(ASCII 码值为0的字符'0')。对一个字符串的访问则是通过指向字符串中第一个字符的指针来实现的。一个字符串的值就是它的第一个字符的地址。因此,在C语言中字符串其实就是指向字符串首个字符的指针。在这个意义上,字符串很像数组,因为数组名也是指向其首个元素的指针。

15d0e6aefb696446642a51e74aba3703.png

例如,我们可以将一个字符串放到一个一维字符数组中,将多个字符串放到一个二维字符数组中。当定义一个字符数组来存储字符数组时,这个字符数组必须足够大,以便能存储下字符字符串中的字符以及字符串结束符。用二维字符数组存储多个字符串时,应保证二维字符数组的列数足够大,以便能容纳得下最长的那个字符串。打印一个不包含字符串结束符的字符串,将导致字符串后边的字符也被持续地打印出来,直到遇到一个空字符为止。每个字符串在内存中都占用一段连续的存储空间,而且这段连续的存储空间有唯一确定的首地址。如果它只是一个字符串常量,那么这个字符串常量本身代表的就是该字符串在内存中所占连续存储单元的首地址;如果用一个一维字符数组存储字符串,那么这个一维字符数组的名字就代表这个首地址。

f0a3a42c5ee0900fbe2ccc1c86ffebbc.png

用字符型数据对数组进行初始化

因为字符数组是由字符组成的数组,所以字符型数组对数组进行初始化。即把所赋值初值依次放在一对花括号内。例如:

charstd1[6]={'c','h','i','n','a','0'};

字符数组赋值std后,其存储结构如图:

23a819de253105a88bb19aa4f1778c02.png

字符数组std有6个元素,但其存储的字符串长度为5,这是因为字符结束标志'0'也占用一字节的存储,但它不计字符串的实际长度。因此,在定义字符数组长度时,除了要考虑字符串中的实际字符个数外,还必须多留出一字节的存储单元,以便存储'0'。

如果省略对数组的长度的声明,例如:

charstd2[]={'c','h','i','n','a','0'};

那么系统默认的std2数组的长度为6。而对于

charstd3[]={'c','h','i','n','a','0'};

系统默认的std3数组的长度为5.由于初始化列表的末尾没有字符串结束标志'0',也没有多余的空间供系统自动添加字符串结束字符'0',因此,这时定义的std3仅仅是一个长度为5的字符数组,不能把它当作字符串来使用。由此可见,一个字符型一维数组并不一定是一个字符串,只有当字符型一维数组中的最后一个元素值为'0'时,它才构成字符串。按照上面这种方式给字符数组赋初值时,必须人为加入'0',才能将其作为字符串来使用。

affd18918a1a4c958f5f0c7438ba5e5d.png

用字符串常量直接对数组初始化

C语言允许用字符串常量直接初始化一个字符数组。例如:

charstd[6]={"china"};

也可以这样:

charstd[6]="china";

这时,数组定义的长度应大于等于字符串中包括'0'在内的字符个数。而下面的语句;

charstd[5]={"china"};

这是不正确的。因为存储字符串“china”至小需要6个字节的存储单元,当长度声明为5时,将会因存储空间不足而无法存放'0',从而使系统无法将std按字符串来处理。

小贴士:为了用字符数组来存储长度为N的字符串,数组长度至少定义为N+1,其中前N个元素用于存放字符串的N个实际字符,而最后一个元素用于存放字符串结束标志。

定义数组时,若省略长度声明,则编译程序将自动按初始化列表内提供的初始值的个数定义数组的长度。例如:

charstd[]={"china"};(或charstd[]="china";)

由于"china"是字符串常量,系统自动在其尾部加入'0',因此系统默认数组std的长度为6.

d78ade73b7987063af028ab3a2eba367.png

对于用二维字符数组存放多个字符串的情形,第二维的长度不能省略,应按最长的字符串长度设定,第一维的长度代表要存储的字符串的个数,可以省略。例如:

char weekday[7][10]={"Sunday

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值