一个简单的问题,关于char *

lht210000 2006-08-07 06:48:23
const char* str5 = "abc";
const char* str6 = "abc";
cout << ( str5==str6 ) << endl; // 输出什么?
str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。

我不明白,难道str5和str6指向的是同一个静态数据区吗?
const char* str5 = "abc";
const char* str6 = "abc";
这两句就开辟同一块静态数据区.
...全文
243 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiushu 2006-08-07
  • 打赏
  • 举报
回复
顺便问一句指针变量的值怎样输出,格式符是"%p"(上边的程序好象这样在用)吗??
tailzhou 2006-08-07
  • 打赏
  • 举报
回复
lht210000() 你自己的理解就是对的;

结果跟具体的实现相关;
Vespertine 2006-08-07
  • 打赏
  • 举报
回复
str5和str6并非数组而是字符指针,并不分配存储区
----------------------------------------------
指针也是变量呀,怎么会不分配存储区?
netxuning 2006-08-07
  • 打赏
  • 举报
回复
楼主的问题正是我想求证的!
zez 2006-08-07
  • 打赏
  • 举报
回复
这叫做 优化!!

两个一样的东西你非要存两遍.. 纯粹浪费空间
knowlove 2006-08-07
  • 打赏
  • 举报
回复
(gdb) No frame selected.r

Starting program: c:\Program Files\_Usr/aa.exe
p=00403000,q=00403000k=00403000

Program exited normally.
knowlove 2006-08-07
  • 打赏
  • 举报
回复
"abc"是常量编译的时候就存放在静态存储区了,它的地址不变。
#include<stdio.h>
void func()
{
int *k="hello";
printf("k=%p\n",k);
}
int main(void)
{
int *p="hello";
int *q="hello";
printf("p=%p,q=%p",p,q);
func();
// fflush(NULL);
return 0;
}
SJMSYQ 2006-08-07
  • 打赏
  • 举报
回复
开辟了两个静态区 内容一样 但地址不同 地址相比较 结果为假false
lht210000 2006-08-07
  • 打赏
  • 举报
回复
你们都没有到到根上,还是我自己来说把,这也是我刚学来的


这种情况比较特殊。str5、str6是字符指针,存放的是常量字符"abc"的起始地址。对于相同的常量字符串,现在的编译器一般都只存放它的一

个拷贝,所以这时 str5==str6 为 true。但是并不是所有的编译器都会这样做,所以 str5==str6 的结果是实现相关的。
Dong 2006-08-07
  • 打赏
  • 举报
回复
这个要看编译器的处理!
编译起回把常量字符串存储在一个固定的逻辑区域!
只要使用到常量变量的地方在编译的时候的替换成指针的值了!

这个问题可以简单的看成是:
cout << ( "abc"=="abc" ) << endl;
那么肯定是1(true)啊!
lj860603 2006-08-07
  • 打赏
  • 举报
回复
cout << ( str5==str6 ) << endl; // 输出什么?
==================
这个输出不就是1就试,因为两个指针指向同一内存地址,所以成立,结果1
lj860603 2006-08-07
  • 打赏
  • 举报
回复
str5和str6指向的是同一个静态数据区吗?
=========
是的
lj860603 2006-08-07
  • 打赏
  • 举报
回复
输出的是1

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧