C语言的基本概念2_字符串数组(再深入分析)

我的上一篇文章中写到

深入分析可以 见博客  : https://blog.csdn.net/misskissC/article/details/8165592

在那边我遇到了一个问题

上面的博客说:

int main(void)
{
        //Address of ch1[0]
        printf("ch1[%d] address: %p\n", 0, ch1);

        //Address of ch1[2]
        printf("ch1[%d] address: %p\n", 2, &ch1[2]);

        //Address of ch2[0]
        printf("ch2[%d] address: %p\n", 0, &ch2[0]);

        //Print ch1, ch2
        printf("String ch1 is: %s\n", ch1);
        printf("String ch2 is: %s\n", ch2);

        return 0;
}



经以上编译方式后运行可执行文件得到结果如下:
ch1[0] address: 0x804967c
ch1[2] address: 0x804967e
ch2[0] address: 0x804967f
String ch1 is: abcabc
String ch2 is: abc
 

分析程序运行的结果:字符数组中每一个元素占据一个字节的内存,ch1[0]所存的地址为:0x804967c,则ch[1]的地址为0x804967d,故ch1[2]的地址为0x804967e,可喜的是紧接着定义的这个数组的首地址跟ch1最后一个元素的地址成连续关系,ch2(即ch2[0])的地址为:0x804967f
则ch1及ch2在内存中的存储形式为:(在这时它给了一张图)
 

 

 

分析,图1:
先撇开数据存储时都是二进制形式。根据程序输出结果可知数组存储和数组元素存储(一个数组内的元素连续存储)满足图1关系。
首先由字符数组的特点:不以字符'\0'为结束标志。( 它这边这样说,我使用的是vc ++ 6.0 它是 0,还是看编译吧)
         由字符串数组特点:以字符'\0'为结束标志。

其次,用printf函数以参数"%s"输出字符串时过程为:
从首地址开始逐字节寻址,把存储单元(一个字节)内的数据转换为相应数据应具有的的形式(如把二进制数转换为字符‘a’)
直到某一个字节内存的元素为字符'\0'时,输出此字符并且寻址结束。
由以上列举的”首先、其次“来看printf("String ch1 is: %s\n", ch1);语句,原来此语句在找到了ch1中所有的元素之后并没有找到字符'\0',所以继续往下寻址打印字符,直到寻到ch2[3]地址:0x804982时遇到字符'\0'放才结束寻址。所以打印结果为地址0x804967c到地址0x8049682中存储的所有内容,内容刚好为输出的字符串"abcabc"。

所以,通过这个笔记可以看出C语言中printf函数中的"%s"直到遇到内存中的‘\0’标志时才会结束输出。
依照它的编译器说:以上的分析没有错误(满足两点,1、地址的连续性,2、直到遇到内存中的‘\0’标志时才会结束输出。

 

 

 

 

说了那么多,还是看编译器,多用用字符型数据,字符数组,有时候坑,(比方说,没有结束标志,你知道它在什么时候,未定义的地方被赋值为 0,还是 ’\0'呢)

 谁让C语言先出来,C语言的国际标准后出来呢,不要过多地用你的理论,去相信你的编译器,有很多不靠谱的地方。

莫名有种蛋疼的感觉..........

还有啊,有时候,网上说得也不靠谱。一切试了才知道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值