鱼C论坛

 找回密码
 立即注册
查看: 1549|回复: 20

[已解决]字符串不就是数组吗?为什么结果会不一样?

[复制链接]
发表于 2020-3-9 10:49:33 | 显示全部楼层 |阅读模式
20鱼币
最佳答案
2020-3-9 10:49:34
本帖最后由 Cool_Breeze 于 2020-3-10 13:36 编辑
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         char *a[2]={"AAA","AAA"};
  5.         char *b[2]={{'\0','A','A','\0'},{'\0','A','A','\0'}};
  6.         char d[]={'A','A','A','\0'};
  7.         char e[]={'A','A','A','\0'};
  8.         char *c[2]={d,e};
  9.         printf("a[0]=%s\n",*a);
  10.         printf("b[0]=%s\n",*b);
  11.         printf("c[0]=%s\n",*c);
  12.         #if 0
  13.                 有没有看出什么来?
  14.         #endif
  15.         return 0;
  16. }
复制代码
  1. a[0]=AAA
  2. b[0]=(null)
  3. c[0]=AAA

  4. --------------------------------
  5. Process exited after 0.02926 seconds with return value 0
  6. 请按任意键继续. . .
复制代码

输出结果

输出结果

输入的代码

输入的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 10:49:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Cool_Breeze 于 2020-3-10 13:36 编辑
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         char *a[2]={"AAA","AAA"};
  5.         char *b[2]={{'\0','A','A','\0'},{'\0','A','A','\0'}};
  6.         char d[]={'A','A','A','\0'};
  7.         char e[]={'A','A','A','\0'};
  8.         char *c[2]={d,e};
  9.         printf("a[0]=%s\n",*a);
  10.         printf("b[0]=%s\n",*b);
  11.         printf("c[0]=%s\n",*c);
  12.         #if 0
  13.                 有没有看出什么来?
  14.         #endif
  15.         return 0;
  16. }
复制代码
  1. a[0]=AAA
  2. b[0]=(null)
  3. c[0]=AAA

  4. --------------------------------
  5. Process exited after 0.02926 seconds with return value 0
  6. 请按任意键继续. . .
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 10:59:06 | 显示全部楼层
你把*号去掉试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-9 11:01:28 | 显示全部楼层
qiuyouzhi 发表于 2020-3-9 10:59
你把*号去掉试试

能告诉我原理吗?为什么这么写结果不一样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 11:02:15 | 显示全部楼层
非常爱学习 发表于 2020-3-9 11:01
能告诉我原理吗?为什么这么写结果不一样?

要么用指针,要么用数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-9 11:07:39 | 显示全部楼层
qiuyouzhi 发表于 2020-3-9 11:02
要么用指针,要么用数组

“AAA”和{'A','A','A','\0'}是相等的吧?
*a和*b输出的都应该是AAA吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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无法正常输出,可能会有乱码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

*a能输出AAA,*b不能正常输出
好晕
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 11:34:53 | 显示全部楼层
非常爱学习 发表于 2020-3-9 11:28
*a能输出AAA,*b不能正常输出
好晕

你把*b改成这样:
  1. *b = {'A', 'A', 'A', '\0'}
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-9 11:52:50 | 显示全部楼层
qiuyouzhi 发表于 2020-3-9 11:34
你把*b改成这样:

这个我明白
想不通char *b[2] = {{'A','A','A','\0'},{'A','A','A','\0'}}
这个指针数组到底有啥问题,里面明明是两个常量指针
这不就跟char *a[2] = {"AAA", "AAA"}相等吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 11:57:24 | 显示全部楼层
非常爱学习 发表于 2020-3-9 11:52
这个我明白
想不通char *b[2] = {{'A','A','A','\0'},{'A','A','A','\0'}}
这个指针数组到底有啥问题, ...

指针不会自动加入'\0'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-9 11:58:54 | 显示全部楼层
qiuyouzhi 发表于 2020-3-9 11:57
指针不会自动加入'\0'

可我自己加了‘\0'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 12:00:01 | 显示全部楼层

所以第二个就运行不了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-9 12:16:13 | 显示全部楼层
qiuyouzhi 发表于 2020-3-9 12:00
所以第二个就运行不了啊

??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 12:23:54 | 显示全部楼层

发错帖子了,我待会删掉
第一个有两个大括号,编译器就认为这是一个二维数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 12:44:54 | 显示全部楼层

发错帖子了,我待会删掉
第一个有两个大括号,编译器就认为这是一个二维数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-10 09:49:28 | 显示全部楼层
b[2][4]
你觉得里面保存的都是字符串,你理解的概念是错误的,字符串数组和二维数组搞混了。
学习不要钻牛角尖,按照正常思路进行下去就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-10 12:43:28 | 显示全部楼层
  1. "AAA"
  2. {'A', 'A', '\0'}
复制代码


这是两个完全不同的东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-10 17:41:01 | 显示全部楼层

这是什么原理??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-10 19:06:22 | 显示全部楼层
引用C语言参考手册的一句话(一般而言,指针类型的初始值的结果必须是一个转换为指针类型的整数,或者是一个地址加上或减去一个整数常量的结果。这个限制反映了大多数链接器的功能)
举个小列子char *p = (char *)123456789
指针变量和数组名很像,但是他们只是哥俩好!
指针变量只能存放一个地址{'A','A','A','\0'}编译器不会认为是一个字符串的地址,(通过上面结论只是把第一个字符常量的地址赋予了指针变量)
数组名{'A','A','A','\0'}相对于给指定元素赋值
字符串(数组)会储存在连续的内存空间中!
其实我感觉我解释的也不清楚!我也是学了几个月!只会一些语法!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 02:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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