免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3618 | 回复: 11
打印 上一主题 下一主题

请问这段代码的输出结果是什么,谢谢了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-29 20:23 |只看该作者 |倒序浏览
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()

  4. {
  5.                 char a[] = "abc";
  6.                 char b[] = "abc";

  7.                 const char c[] = "abc";
  8.                 const char d[] = "abc";

  9.                 char * e = "abc";
  10.                 char * f = "abc";

  11.                 const char * g = "abc";
  12.                 const char * h = "abc";

  13.                 printf("%d\n",(a==b));
  14.                 printf("%d\n",(c==d));
  15.                 printf("%d\n",(e==f));
  16.                 printf("%d\n",(g==h));

  17.                 return 0;
  18. }
复制代码
最好给解释一下为什么会是这样的结果

我搞不明白他们之间的区别  

谢谢了

论坛徽章:
223
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:10操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
2 [报告]
发表于 2010-10-29 21:21 |只看该作者
return@localhost:~/op$
return@localhost:~/op$ cat hl.c
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
               char a[] = "abc";
                char b[] = "abc";

                const char c[] = "abc";
                const char d[] = "abc";

                char * e = "abc";
                char * f = "abc";

                const char * g = "abc";
                const char * h = "abc";

                printf("%d\n",(a==b));
                printf("%d\n",(c==d));
                printf("%d\n",(e==f));
                printf("%d\n",(g==h));

                return 0;
}
return@localhost:~/op$
return@localhost:~/op$ gcc hl.c -o hl
return@localhost:~/op$ ./hl
0
0
1
1
return@localhost:~/op$
return@localhost:~/op$

论坛徽章:
0
3 [报告]
发表于 2010-10-29 21:28 |只看该作者
0的是数组
1的是指针 指向相同的常量 地址

论坛徽章:
0
4 [报告]
发表于 2010-10-30 13:48 |只看该作者
char a[] = "abc";
char b[] = "abc";

const char c[] = "abc";
const char d[] = "abc";
以上四个都是数据变量,编译器会将字符串“abc”,复制到相应的地址空间,如char a[] = "abc";就会把“abc”复制到a数据所属的地址空间。

、**********************
char * e = "abc";
char * f = "abc";

  const char * g = "abc";
const char * h = "abc";
而以上四个则是指针变量,他们是指针而不是数组。他们的作用都只是指向一段内存空间。代码中虽然出现了几个“abcr”的字符串,但是编译器只会生成一个"abc"字符串存储于代码段。所以上面的四段代码都会指向同一个地址,即代码段“abc”字符串的首地址。

论坛徽章:
0
5 [报告]
发表于 2010-10-30 18:10 |只看该作者

char a[] = "abc";
char b[] = "abc";

char * e = "abc";
char * f = "abc";


a==b比较的是数组a和数组b的地址还是数组中的内容?(从结果来看是前者)
e==f比较的是指针e和指针f的值还是指针所指向的内容?(从结果来看是后者)



除了死记住上面推断出来的结论,还有更好的理解方式吗?

论坛徽章:
2
戌狗
日期:2013-11-06 17:35:36寅虎
日期:2014-10-20 23:12:29
6 [报告]
发表于 2010-10-30 18:21 |只看该作者
前两组和后两组是一个意思, 数组名是一个指针常量,不过数组必须要有确切的大小。在初始赋值的时候会进行内容拷贝。

后面两个都会产生常量指针,而这个指针不过是一个c里字符常量的一个别名,或引用吧。

所以

  1. char a[] = "abc";

  2. a += 1; //error

  3. char *c = "abc";

  4. c += 1; //ok
复制代码
如果把这些地址打印出来就可以看出

  1. int main(int argc, char* argv[])
  2. {
  3.         char a[] = "abc";
  4.         char b[] = "abc";

  5.         const char c[] = "abc";
  6.         const char d[] = "abc";

  7.         char * e = "abc";
  8.         char * f = "abc";

  9.         const char *g = "abc";
  10.         const char *h = "abc";

  11.         printf("%d\t%ul\t%ul\n", (a == b), (unsigned long)a, (unsigned long)b);
  12.         printf("%d\t%ul\t%ul\n", (c == d), (unsigned long)c, (unsigned long)d);
  13.         printf("%d\t%ul\t%ul\n", (e == f), (unsigned long)e, (unsigned long)f);
  14.         printf("%d\t%ul\t%ul\n", (g == h), (unsigned long)g, (unsigned long)h);
  15.         return 0;
  16. }
复制代码
看出数组和字符串常量是放在不同的段上。

论坛徽章:
0
7 [报告]
发表于 2010-10-30 23:20 |只看该作者
谢谢各位的耐心解释

论坛徽章:
0
8 [报告]
发表于 2010-10-31 11:28 |只看该作者
回复 5# bw_0927


   

char a[] = "abc";
char b[] = "abc";

char * e = "abc";
char * f = "abc";


a==b比较的是数组a和数组b的地址还是数组中的内容?(从结果来看是前者)
e==f比较的是指针e和指针f的值还是指针所指向的内容?(从结果来看是后者)



除了死记住上面推断出来的结论,还有更好的理解方式吗?


e==f比较的还是指针e和指针f的值,不是其指向的内容。
只不过编译器的优化,这两个指针的值指向同一个内容而已,
如果其他的编译器不做这个优化,放两份相同的“abc”,e和f分别指向这两份,地址不同,也是无可厚非的

论坛徽章:
0
9 [报告]
发表于 2010-10-31 12:52 |只看该作者
最好给解释一下为什么会是这样的结果

我搞不明白他们之间的区别  

谢谢了
bw_0927 发表于 2010-10-29 20:23



    字符串"abc"的地址是在常量区的,指针指向的是这个地址,所以指针的值相等。

   对于数组的地址是在栈中分配的,按照变量的顺序分配,地址是不相等的,只是数组的内容是一样的,。

论坛徽章:
0
10 [报告]
发表于 2010-10-31 13:26 |只看该作者
回复 8# drangon


    就是说如果没有编译器的优化的前提下,这个程序的结果应该都是0。是吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP