C语言字符数组赋值时如果加双引号赋值为什么会只会输出p

做自己 不忘初心 2019-10-01 06:21:16
...全文
933 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 4 楼 ~稻草人~的回复:
兄弟,你这个小问题关联了很多知识点,给你拆分一下 1:数组,定义时就确定存储地址,在内存中开辟一段存储空间。使用时地地址是不可变的,和指针最大的区别所在。所以字符数组定义时要么明确数组下标,要么用双引号赋字符串。其它类型数组定义时,原则一样。 2:字符数组赋值,你要理解为只有两种方法,一,定义时,直接赋字符串,如 char str[20]=“hello!”,二,定义过后,只能单个字符赋值,如 str[0]='f'。 3:单引号和双引号。单引号就是字符,双引号是字符串,但有更多意思:把双引号内的字符数据,按顺序并尾部加'\0',存放在内存中,并返回存储位置的首地址。 4:结尾符号,'\0',其实就是数值0,在字符数组中,你加不加结尾符,没规定,看你怎么处理其中数据而已,很灵活的。如,使用printf函数,必须加,如果你没0结尾,它从数组首地开始读取并输出,可能一个也不输出,也可能输出十万个,直到遇到第一个0,和数组多大没关系。 所以,你代码中有个明显错误, 1:第五行,str[0]赋值只能用单引号,单个字符赋值。如果用双引号,不是赋值,是赋字符串地址,数据定义过后,是不能改地址的。 2:第五行中,你想把双引号中的数据赋给[0],但双引号其实是提取字符串地址的,地址是32位,而你str是8位的,所以,这一句是把“F”的内存地址的低8位值赋给[0] 3:然后,当你puts(str),是把“F”字符串地址的低8位,以字符形式输出了
谢谢你,不过,执行第五行,计算机做了哪些事?
7.83Hz 2019-10-02
  • 打赏
  • 举报
回复 1
兄弟,你这个小问题关联了很多知识点,给你拆分一下 1:数组,定义时就确定存储地址,在内存中开辟一段存储空间。使用时地地址是不可变的,和指针最大的区别所在。所以字符数组定义时要么明确数组下标,要么用双引号赋字符串。其它类型数组定义时,原则一样。 2:字符数组赋值,你要理解为只有两种方法,一,定义时,直接赋字符串,如 char str[20]=“hello!”,二,定义过后,只能单个字符赋值,如 str[0]='f'。 3:单引号和双引号。单引号就是字符,双引号是字符串,但有更多意思:把双引号内的字符数据,按顺序并尾部加'\0',存放在内存中,并返回存储位置的首地址。 4:结尾符号,'\0',其实就是数值0,在字符数组中,你加不加结尾符,没规定,看你怎么处理其中数据而已,很灵活的。如,使用printf函数,必须加,如果你没0结尾,它从数组首地开始读取并输出,可能一个也不输出,也可能输出十万个,直到遇到第一个0,和数组多大没关系。 所以,你代码中有个明显错误, 1:第五行,str[0]赋值只能用单引号,单个字符赋值。如果用双引号,不是赋值,是赋字符串地址,数据定义过后,是不能改地址的。 2:第五行中,你想把双引号中的数据赋给[0],但双引号其实是提取字符串地址的,地址是32位,而你str是8位的,所以,这一句是把“F”的内存地址的低8位值赋给[0] 3:然后,当你puts(str),是把“F”字符串地址的低8位,以字符形式输出了
铖邑 2019-10-01
  • 打赏
  • 举报
回复
啊,字那么小,居然没看清楚是双引号呀。 这个用strcpy(str, “f”);就可以了呀 另外@楼上,char p[3]=“123”;不能通过编译,但是char p[4]=“123”;却可以通过编译的。因为这不是赋值,这是初始化
提及 2019-10-01
  • 打赏
  • 举报
回复
不支持字符串直接赋值 字符串是有多个字符组成的,就算可视化是一个字符,那它也是由两个字符组成的 `""` 这种写法会隐含一个 '\0' ,'\0' 就是 数值 0 你可自己验证一下,这种概念一定要知道 ``` char p[3] = "123"; // 能通过吗? ```
铖邑 2019-10-01
  • 打赏
  • 举报
回复
因为你str[1]没设置为字符串结束标志啊,知道是什么字符吗?对,就是’\0’ 应该是:str[1] = ‘\0’;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧