C/C++ 语言字符数组和字符串数组的疑惑

下面几个形式该如何理解,charst[30]="Mynameis";puts(&st[0]);//这边运行出来的结果为Mynameis运行OK。charst[30]="M... 下面几个形式该如何理解,
char st[30]="Mynameis";puts(&st[0]);//这边运行出来的结果为 Mynameis 运行OK。
char st[30]="Mynameis";puts(st[0]);//这边运行就报错,数组不就是地址么?为什么还要加取地址符&??
char st[30]="Mynameis";puts(&st[1]);//这边运行结果为 ynameis , 开头字母M为什么会丢掉?
char st[5]={‘a’,'b','c','d','e'};
printf("%c",st[1]);//这边不用加取地址符运正常为b
char st[5]={‘a’,'b','c','d','e'};
printf("%c",&st[1]);//这边加取地址符运行就为一个符号,可能是乱码,为什么?
展开
 我来答
machunleilei
推荐于2016-10-28 · TA获得超过467个赞
知道小有建树答主
回答量:141
采纳率:0%
帮助的人:184万
展开全部
看了一下你的问题,我觉得先有必要说一下在C语言中如何去看待字符串,字符串在C语言中其实就是一系列字符组成的,只不过记住在最后面会加上一个'\0'字符,用来标示字符串的结束。
字符串的首个字符的位置其实就是字符串的首地址,对于一般的处理函数来说,对字符串的处理都是从首字符开始,依次遍历字符序列,只要找到了'\0'字符为止。下面就详细就你给出的进行分析:
char str[30] = "Mynameis";定义了一个字符串,地址很明显我们可以通过str获得,puts这个函数需要一个字符串的首地址,str[0]表示的是取得字符串中第0个位置的字符,注意,这里是字符,而不是地址,所以我们需要通过'&'操作来生成一个地址,&str[0] 其实就是str.可想而知,puts遍历了这个字符串序列直到找到了'\0'
根据上面的解释很容易知道第二个为什么报错了
char str[30] = "Mynameis";puts(&str[1])这里首先str[1]表示取字符序列中的第一个字符,然后&str[1]表示取第一个字符在字符序列中的地址,也就是告诉了puts从第一个字符处开始向后面遍历这个字符串,这样很明显就跳过了第0个字符了。导致输出结果中不含有第0个字符M
char str[5] = {'a', 'b', 'c', 'd', 'e'};这是定义了一个字符数组,不是字符串,导致这个数组不会自动以'\0'结束,printf中的%c表明后面格式化的是一个字符,所以运行正常
而对于最后一个printf("%c", &str[1]),str[1]是字符数组中的第一个元素,&str[1]是第一个元素的地址,而%c期待的是一个字符,但是&str[1]却是一个地址,其实地址就是一个32位(X86机器)的整型数值,这样导致会将这个4B的数组中的最低一个Byte转换成为字符,然后输出。这就是为什么导致输出的可能是一个乱码了。
wang433
2013-09-22 · TA获得超过969个赞
知道小有建树答主
回答量:320
采纳率:0%
帮助的人:127万
展开全部
基本原理:
C语言中字符串是指从某个内存地址开始的字符到特定的字符'\0'为止。字符串实际上就是用字符串的第一个字符的“首地址”表示。
char st[30]="Mynameis";puts(&st[0]);//这边运行出来的结果为 Mynameis 运行OK。
-->&st[0]当然是'M'的首地址了,所以该语句当然输出从M开始的整个字符串
char st[30]="Mynameis";puts(st[0]);//这边运行就报错,数组不就是地址么?为什么还要加取地址符&??
-->st[0]是字符'M',而puts(*)中的参数必须是“地址”才行,所以,这个调用当然是错的。
char st[30]="Mynameis";puts(&st[1]);//这边运行结果为 ynameis , 开头字母M为什么会丢掉?
-->&st[1]是字符以'y'的首地十的字符串,所以结果当然没有M了
char st[5]={‘a’,'b','c','d','e'};
printf("%c",st[1]);//这边不用加取地址符运正常为b
-->这个是一个字符数组,在最后一个字符没有'\0',所以它不是一个字符串,st[1]表示数组的第一个字符,当然是b了。注意格式符为'%c‘,就表示一个字符的意思.
char st[5]={‘a’,'b','c','d','e'};
printf("%c",&st[1]);//这边加取地址符运行就为一个符号,可能是乱码,为什么?
-->&st[1]是一个地址,占2字节(有的是四个字节),而%c是显示一个1字节的字符。所以&st[1]不可能显示合适的字符了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hu0904
2013-09-21 · TA获得超过222个赞
知道小有建树答主
回答量:510
采纳率:0%
帮助的人:461万
展开全部
非void型别指针调用operator []相当与解引用 其返回下标指向的数据的引用 下标从0开始包含0,最大下表为数组大小-1,这些都是基础 很基础很基础的 多看看书吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
郝在益
2013-09-21 · TA获得超过2079个赞
知道小有建树答主
回答量:1496
采纳率:54%
帮助的人:632万
展开全部
对于第二个:数组名是地址,而不是数组是地址。所以你可以直接写st,但是不能写st[0]。st[0]是表示的一个字符,所以需要取地址符。
对于第三个,你是以st[1]开始的,所以当然会将前面的字符去掉。
对于printf,输出是不需要取地址的,取地址的话输出的就是地址的值。其实不是乱码,是地址。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友2fe62d8
2013-09-21 · 超过10用户采纳过TA的回答
知道答主
回答量:27
采纳率:0%
帮助的人:20.5万
展开全部
char st[30]="Mynameis";puts(st[0]);//这边运行就报错,数组不就是地址么?为什么还要加取地址符&??
数组不是地址,st[0]表示的是数组第一个元素的值,并不是数组的地址,如果是数组的地址,应该是 st

char st[30]="Mynameis";puts(&st[1]);//这边运行结果为 ynameis , 开头字母M为什么会丢掉?
数组是从0开始的,&st[1]是从数组第二个元素开始,所以M没有了

printf("%c",st[1]);//这边不用加取地址符运正常为b
只是打印一个字符,st[1]中存的就是,所以正常。

printf("%c",&st[1]);//这边加取地址符运行就为一个符号,可能是乱码,为什么?
&st[1]是第二个元素的地址,跟使用的%c不符,使用%s打印字符串就可以正常显示了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式