dysow 发表于 2020-9-7 17:43:43

指针数组的输出问题

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

这个程序第一个printf输出乱码,第二个正常,不懂是哪里问题?
str这个里面存的是字符a的地址么?

dysow 发表于 2020-9-7 17:48:16

printf("%c\n%c\n%c\n", *str, *str, *str);这样就可以输出

LuLD 发表于 2020-9-7 19:21:19

第一点 : 因为 你的数组里用的是" 双引号,这是字符串的表达方式
                单一字符用 '单引号

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

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


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


printf("%c\n%c\n%c\n", *str, *str, *str)输出正确
个人理解的意思是
是因为 *str 相当于 是 *(*(str + 0)+0)   也就是str
也就是 一维数组变成了二维数组的意思
以上 仅供参考

405794672 发表于 2020-9-7 19:53:27

你说的对,str是一个地址。那个a不是字符,是字符串,它后面还有个隐藏的'\0'。两个字符构成了"a"这个字符串。双引号表示是字符串,单引号是字符。

tttxiaoz 发表于 2020-9-8 09:08:43

405794672 发表于 2020-9-7 19:53
你说的对,str是一个地址。那个a不是字符,是字符串,它后面还有个隐藏的'\0'。两个字符构成了"a"这个字 ...

对一个str是首地址所有用%c输出错误

风过无痕1989 发表于 2020-9-8 10:42:54

char *str[]: 根据运算优先级str首先和[]结合,说明他是一个数组。然后其类型是char*。char*一般可用来指向字符串,所以说它是一个字符串数组,其成员可以是"a"、"c"、"e"、“abc"、"123"等。

控制字符 %c 输出的是单个字符,用它来输出字符串是错误的。正如楼上几位所说:表面上看是一个单独的字母 "a",其实它的后面还有一个结束标志 '\0'

dysow 发表于 2020-9-10 17:23:35

LuLD 发表于 2020-9-7 19:21
第一点 : 因为 你的数组里用的是" 双引号,这是字符串的表达方式
                单一字符用 '单 ...

我理解您说的*(*(str + 0)+0)这个的含义:*(str+0)这个就是a了,但*(a+0)我不理解了,a是一个值并不是地址,怎么做运算呢?

LuLD 发表于 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 !


推荐一个老师讲解的指针与 数组: https://www.bilibili.com/video/BV1uJ411d7u7
页: [1]
查看完整版本: 指针数组的输出问题