c语言char s[] 语句,35、若有定义和语句: char s[10]="abcd";printf("%s\n",s); 则结果是(以下u代表空格)...

7d1592f0814847d4aca294651e8bc8e0.png

onemoo

char s{10] = "abcd";"abcd" 这样的字符串字面量其实就是字符数组,并且会带有结尾的 '\0' 字符,就是说它实际上相当于是 {'a', 'b', 'c', 'd', '\0'} 数组。而且字符串字面量可以用来初始化字符数组,这样字符数组元素就依次得到这字符串字面量中的字符。字符数组比初始化字符串更大的话,多出来没有得到初值的字符元素的值就是 '\0'。所以 s 数组在初始化之后其中的字符就是 {'a', 'b', 'c', 'd', '\0', '\0', ... 后面都是 '\0'}printf 的 %s 对应字符串,C 语言的字符串就是以 '\0' 结尾的字符数组,所以后面对应传入了 s。如果你还记得数组实参的隐式转型的话,这里传入的其实是“指向 s 首元素的指针”,而 printf 就从这个指针所指的字符开始打印,直到 '\0' 为止。那么 printf("%s\n",s); 这个语句,既然 s 是指首元素的指针,所以 printf 就从 s 数组的第一个 'a' 开始打印。虽然 s 数组一共有 10 个元素,但是第 5 个元素就是 '\0',这就视为字符串结尾,所以会打印出 abcd。至于你说的 printf("%s\n",s + i);这个 i 肯定是个整型数,s + i 是指针和整型的加法,这相当于得到指向 s 指针向后跳 i 位的指针。那么实际传入 printf 的指针就是从 s 数组开头向后跳 i 位的指针,printf 就会从所指的那个字符开始打印。所以“printf("%s\n",s+i);而不是这个printf("%s\n",s);是这两种写法都行吗?”如果 i 是整型,那这两种写法都是合法的。如果 i 也不会跳出数组 s 的范围,那么第二种写法也是合理的,运行没有问题。当然两种写法打印出的结果就可能不同了。只有 printf("%s\n", s + 0) 的结果才会和 printf("%s\n", s) 一样。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值