printf与字符串,数组的结合

文章讨论了C语言中数组和字符串在解引用方面的差异,指出打印字符串无需解引用,而打印数组元素需要。字符串在C语言中被视为字符数组,其地址表示字符串的起始位置。初始化数组时,字符串会被拷贝到数组中,而不是让数组指向静态区。打印变量无需解引用,因为编译器通过符号表找到变量的内存地址。
摘要由CSDN通过智能技术生成

   一问题背景:

 在用数组打印字符串的时候我们可以发现,这个时候是不用解引用的,但是在打印数组元素的时候,我们却要解引用,arr1[1]哪里解引用了呢,其实arr1[1]等价于*[arr+1].

  二 在我搜集资料中,我还产生了如下两个问题

     (1)char*p="bite"这种形式的意思。

    我就在想这是个什么意思呢,左边是个指针变量,右边是个字符串,这怎么赋值呢,后来我才知道,原来字符串在c语言中其实就是个数组,而"bite"就是表示一个地址,而且是首元素b的地址,如果此时用%c打印解引用后的字符串,结果会出现b。

 当然如果是个‘b’这就是个字符,而不是字符串,更不会被当成数组,也就没有表示一个地址的这种说法。

(2)初始化数组可以用字符串赋值,其它情况属于什么?

   我们都知道,char*p="bit",这个说明指针变量p指向了静态区中字符串的位置,那如果数组初始化会不会使得数组指向静态区呢,其实是不会的,初始化数组的时候是把字符串拷贝到数组中去,数也就是说这个时候内存中有两份字符串。可通过两份字符串地址验证:

 此时arr数组对应的地址与指针变量p对应的地址不同,这说明内存中有两份字符串。

但如果是其它情况下如arr="byte",这时候等号左边表示数组首元素地址是个常量,现在要这个地址等于指向字符串的地址,这不合标准。

为什么打印字符串可以不用解引用呢,而打印整形数组,字符数组就要解引用,目前来说应该是%s这个符号的作用,它让printf可以找到字符串的位置并将其打印,也可以从设计上理解,字符串有结束标志\0,整型数组没有,连续打印是会出问题的。还有就是打印变量貌似没有解引用这个说法,变量名在计算机中算什么呢?首先代码转为机械代码的时候没有保存变量名,却又能通过变量名找到内存空间,我查资料得出的解释是:编译器会把变量名以及它代表的地址保存到符号表,所以当下面代码printf库函数用到这个变量的时候,编译器都会通过符号表的地址找到内存空间的数据,然后传给printf。(这些知识我感觉应该已经有点偏了,我们了解了解就好了,还是那句话,深究就到沟里了)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小何只露尖尖角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值