鱼C论坛

 找回密码
 立即注册
查看: 980|回复: 7

[已解决]指针数组的输出问题

[复制链接]
发表于 2020-9-7 17:43:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
    int main(){
        char *str[3] = {
            "a",
            "c",
            "e"
        };
        printf("%c\n%c\n%c\n", str[0], str[1], str[2]);
        printf("%s\n%s\n%s\n", str[0], str[1], str[2]);
        return 0;
    }

这个程序第一个printf输出乱码,第二个正常,不懂是哪里问题?
str[0]这个里面存的是字符a的地址么?
最佳答案
2020-9-7 19:21:19
第一点 : 因为 你的数组里用的是  " 双引号,这是字符串的表达方式
                单一字符  用 '  单引号

            char *str[3] = {
                                  "a",
                                  "c",
                                  "e"
                                 };

第二点:  第一个输出的 格式是  %c  以字符格式, printf("%c\n%c\n%c\n", str[0], str[1], str[2]);
               第二个输出的 格式是  %s  以字符串格式,printf("%s\n%s\n%s\n", str[0], str[1], str[2]);


结合你的数组里的内容,所以 第一个才会输出 是乱码,第二个是正常


printf("%c\n%c\n%c\n", *str[0], *str[1], *str[2])  输出正确  
个人理解的意思是
是因为 *str[0] 相当于 是 *(*(str + 0)+0)   也就是  str[0][0]
也就是 一维数组变成了二维数组的意思
以上 仅供参考
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-7 17:48:16 | 显示全部楼层
printf("%c\n%c\n%c\n", *str[0], *str[1], *str[2]);  这样就可以输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-7 19:21:19 | 显示全部楼层    本楼为最佳答案   
第一点 : 因为 你的数组里用的是  " 双引号,这是字符串的表达方式
                单一字符  用 '  单引号

            char *str[3] = {
                                  "a",
                                  "c",
                                  "e"
                                 };

第二点:  第一个输出的 格式是  %c  以字符格式, printf("%c\n%c\n%c\n", str[0], str[1], str[2]);
               第二个输出的 格式是  %s  以字符串格式,printf("%s\n%s\n%s\n", str[0], str[1], str[2]);


结合你的数组里的内容,所以 第一个才会输出 是乱码,第二个是正常


printf("%c\n%c\n%c\n", *str[0], *str[1], *str[2])  输出正确  
个人理解的意思是
是因为 *str[0] 相当于 是 *(*(str + 0)+0)   也就是  str[0][0]
也就是 一维数组变成了二维数组的意思
以上 仅供参考
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-7 19:53:27 | 显示全部楼层
你说的对,str[0]是一个地址。那个a不是字符,是字符串,它后面还有个隐藏的'\0'。两个字符构成了"a"这个字符串。双引号表示是字符串,单引号是字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-9-8 09:08:43 | 显示全部楼层
405794672 发表于 2020-9-7 19:53
你说的对,str[0]是一个地址。那个a不是字符,是字符串,它后面还有个隐藏的'\0'。两个字符构成了"a"这个字 ...

对  一个str[0]是首地址  所有用%c输出错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-8 10:42:54 | 显示全部楼层
char *str[]: 根据运算优先级str首先和[]结合,说明他是一个数组。然后其类型是char*。char*一般可用来指向字符串,所以说它是一个字符串数组,其成员可以是"a"、"c"、"e"、“abc"、"123"等。

控制字符 %c 输出的是单个字符,用它来输出字符串是错误的。正如楼上几位所说:表面上看是一个单独的字母 "a",其实它的后面还有一个结束标志 '\0'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-10 17:23:35 | 显示全部楼层
LuLD 发表于 2020-9-7 19:21
第一点 : 因为 你的数组里用的是  " 双引号,这是字符串的表达方式
                单一字符  用 '  单 ...

我理解您说的*(*(str + 0)+0)这个的含义:*(str+0)这个就是a了,但*(a+0)我不理解了,a是一个值并不是地址,怎么做运算呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-11 08:06:52 | 显示全部楼层
本帖最后由 LuLD 于 2020-9-11 09:30 编辑
dysow 发表于 2020-9-10 17:23
我理解您说的*(*(str + 0)+0)这个的含义:*(str+0)这个就是a了,但*(a+0)我不理解了,a是一个值并不是地 ...


代码中并没有  *(a+0),我猜测你是在其他地方看到的,你看到的 *(a+0) 中的这个 a 应该在之前定义成了 指针变量,并且还是指向了这个数组的指针变量 a !
微信图片_20200911092728.png

推荐  一个老师讲解的  指针与 数组  : https://www.bilibili.com/video/BV1uJ411d7u7
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 03:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表