非常爱学习 发表于 2020-3-9 10:49:33

字符串不就是数组吗?为什么结果会不一样?

Cool_Breeze 发表于 2020-3-9 10:49:34

本帖最后由 Cool_Breeze 于 2020-3-10 13:36 编辑

#include <stdio.h>

int main(void)
{
        char *a={"AAA","AAA"};
        char *b={{'\0','A','A','\0'},{'\0','A','A','\0'}};
        char d[]={'A','A','A','\0'};
        char e[]={'A','A','A','\0'};
        char *c={d,e};
        printf("a=%s\n",*a);
        printf("b=%s\n",*b);
        printf("c=%s\n",*c);
        #if 0
                有没有看出什么来?
        #endif
        return 0;
}

a=AAA
b=(null)
c=AAA

--------------------------------
Process exited after 0.02926 seconds with return value 0
请按任意键继续. . .

qiuyouzhi 发表于 2020-3-9 10:59:06

你把*号去掉试试

非常爱学习 发表于 2020-3-9 11:01:28

qiuyouzhi 发表于 2020-3-9 10:59
你把*号去掉试试

能告诉我原理吗?为什么这么写结果不一样?{:10_254:}

qiuyouzhi 发表于 2020-3-9 11:02:15

非常爱学习 发表于 2020-3-9 11:01
能告诉我原理吗?为什么这么写结果不一样?

要么用指针,要么用数组

非常爱学习 发表于 2020-3-9 11:07:39

qiuyouzhi 发表于 2020-3-9 11:02
要么用指针,要么用数组

“AAA”和{'A','A','A','\0'}是相等的吧?
*a和*b输出的都应该是AAA吧?

qiuyouzhi 发表于 2020-3-9 11:09:52

非常爱学习 发表于 2020-3-9 11:07
“AAA”和{'A','A','A','\0'}是相等的吧?
*a和*b输出的都应该是AAA吧?

指针不会自动添加'\0',而数组可以,
如果*b是{'A', 'A', 'A', '\0'},那么它可以正常输出,
而*a无法正常输出,可能会有乱码

非常爱学习 发表于 2020-3-9 11:28:21

qiuyouzhi 发表于 2020-3-9 11:09
指针不会自动添加'\0',而数组可以,
如果*b是{'A', 'A', 'A', '\0'},那么它可以正常输出,
而*a无法正 ...

*a能输出AAA,*b不能正常输出
好晕{:10_269:}

qiuyouzhi 发表于 2020-3-9 11:34:53

非常爱学习 发表于 2020-3-9 11:28
*a能输出AAA,*b不能正常输出
好晕

你把*b改成这样:
*b = {'A', 'A', 'A', '\0'}

非常爱学习 发表于 2020-3-9 11:52:50

qiuyouzhi 发表于 2020-3-9 11:34
你把*b改成这样:

这个我明白
想不通char *b = {{'A','A','A','\0'},{'A','A','A','\0'}}
这个指针数组到底有啥问题,里面明明是两个常量指针{:10_285:}
这不就跟char *a = {"AAA", "AAA"}相等吗?

qiuyouzhi 发表于 2020-3-9 11:57:24

非常爱学习 发表于 2020-3-9 11:52
这个我明白
想不通char *b = {{'A','A','A','\0'},{'A','A','A','\0'}}
这个指针数组到底有啥问题, ...

指针不会自动加入'\0'

非常爱学习 发表于 2020-3-9 11:58:54

qiuyouzhi 发表于 2020-3-9 11:57
指针不会自动加入'\0'

可我自己加了‘\0'

qiuyouzhi 发表于 2020-3-9 12:00:01

非常爱学习 发表于 2020-3-9 11:58
可我自己加了‘\0'

所以第二个就运行不了啊

非常爱学习 发表于 2020-3-9 12:16:13

qiuyouzhi 发表于 2020-3-9 12:00
所以第二个就运行不了啊

??

qiuyouzhi 发表于 2020-3-9 12:23:54

非常爱学习 发表于 2020-3-9 12:16
??

发错帖子了,我待会删掉{:10_250:}
第一个有两个大括号,编译器就认为这是一个二维数组

qiuyouzhi 发表于 2020-3-9 12:44:54

非常爱学习 发表于 2020-3-9 12:16
??

发错帖子了,我待会删掉{:10_250:}
第一个有两个大括号,编译器就认为这是一个二维数组

506076894 发表于 2020-3-10 09:49:28

b
你觉得里面保存的都是字符串,你理解的概念是错误的,字符串数组和二维数组搞混了。
学习不要钻牛角尖,按照正常思路进行下去就行了

人造人 发表于 2020-3-10 12:43:28

"AAA"
{'A', 'A', '\0'}

这是两个完全不同的东西

非常爱学习 发表于 2020-3-10 17:41:01

Cool_Breeze 发表于 2020-3-10 13:18


这是什么原理??

Cool_Breeze 发表于 2020-3-10 19:06:22

引用C语言参考手册的一句话(一般而言,指针类型的初始值的结果必须是一个转换为指针类型的整数,或者是一个地址加上或减去一个整数常量的结果。这个限制反映了大多数链接器的功能)
举个小列子char *p = (char *)123456789
指针变量和数组名很像,但是他们只是哥俩好!
指针变量只能存放一个地址{'A','A','A','\0'}编译器不会认为是一个字符串的地址,(通过上面结论只是把第一个字符常量的地址赋予了指针变量)
数组名{'A','A','A','\0'}相对于给指定元素赋值
字符串(数组)会储存在连续的内存空间中!
其实我感觉我解释的也不清楚!我也是学了几个月!只会一些语法!
页: [1] 2
查看完整版本: 字符串不就是数组吗?为什么结果会不一样?