关于字符串地址的问题

a83736025 2011-03-17 11:31:27
int _tmain(int argc, _TCHAR* argv[])

{

char* str3 = "hello world";

char* str4 = "hello world";



if(str3 == str4)

printf("str3 and str4 are same.\n");

else

printf("str3 and str4 are not same.\n");



return 0;

}
str3和str4是两个指针,我们无需为它们分配内存以存储字符串的内容,而只需要把它们指向"hello world“在内存中的地址就可以了。由于"hello world”是常量字符串,它在内存中只有一个拷贝,因此str3和str4指向的是同一个地址。因此比较str3和str4的值,会是相同的。
以上是在某个博客当中看到的有些疑惑怎么证明他们指向的是同一个地址呢?
cout<<&str1<<"\n"<<&str2<<endl; 输出的是两个不一样的地址值。
求教!!
...全文
386 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
碎碎念 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 a83736025 的回复:]

引用 1 楼 delphiwcdj 的回复:
常量折叠

原理我懂 就是其实想问cout<<&str1<<"\n"<<&str2<<endl; 输出的是两个不一样的地址值。
这里有些模糊
[/Quote]

str1==str2==常量的地址....
但是&str1!=&str2,变量str1,str2,存储在程序栈空间上的不同位置....
失散糖 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lactoferrin 的回复:]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

又是这段话
[/Quote]

确实7楼经常粘这句话...
a83736025 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 kuankuan02 的回复:]
引用 19 楼 a83736025 的回复:
如果定义两个str1[]="hello world";
str2[]="hello world"; 数组那么str1 str2就是他们的存储地址,&str1 &str2 也是他们的存储地址 为什么呢 那么str1 str2 就不能当指针来看待了对吧?


&str1是整个数组或说是整个字符串的地址,str1是该数组的第……
[/Quote]
一样的意义 见22楼,运算符&存在将不转换
software工程师 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 a83736025 的回复:]
如果定义两个str1[]="hello world";
str2[]="hello world"; 数组那么str1 str2就是他们的存储地址,&str1 &str2 也是他们的存储地址 为什么呢 那么str1 str2 就不能当指针来看待了对吧?
[/Quote]

&str1是整个数组或说是整个字符串的地址,str1是该数组的第一个元素的存储地址,他们值是一样的,但意义不同。你试试str1+1,&str1+1...
wopabe 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]
摒弃cout;使用printf!
printf("str3=%p,str4=%p\n",str3,str4);

另外
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指……
[/Quote]
这位老兄老是用相同的话回复很多人
而且一副为人师表的样子
真正有水平的人绝不是这样
AnYidan 2011-03-18
  • 打赏
  • 举报
回复
如果定义两个str1[]="hello world";
str2[]="hello world"; 数组那么str1 str2就是他们的存储地址,&str1 &str2 也是他们的存储地址 为什么呢 那么str1 str2 就不能当指针来看待了对吧?



对于某类型T,如果某表达式或子表达式的类型为“ T的数组”,那么此表达式的值是指向数
组中第一个对象的指针,并且此表达式的类型被转换为“指向T的指针”。如果此表达式是一元
运算符&、+ +、- -或s i z e o f的运算分量,或是赋值类运算符或圆点. 运算符的左运算分量,那么
转换不会发生。

the C programming langague -- page 171
suzhiwei411 2011-03-18
  • 打赏
  • 举报
回复
str3,str4都是指针变量,本身也是一个变量,他们指向的地址是一个内存地址,但是两个不同的变量,也就是说str3和str4是两个不同的指针变量,获得的内存地址是不一样的,但是str3和str4里放的东西是一样的,也就是说指向同一个内存地址。因为常量字符串“hello world”编译器看到两个一样的hello world,不再分配内存地址,还是用第一个hello world 的内存地址,也就是都两个hello world是一个,而不是两个。仔细理解这句话“具有相同值的不同字符串常量在内存中是分开存储的”
看一下这个帖子就明白了http://topic.csdn.net/u/20110317/13/5c83d0a7-b8f9-4857-8379-e96d25b9a580.html
suzhiwei411 2011-03-18
  • 打赏
  • 举报
回复
学习了一个专业属于,常量折叠
a83736025 2011-03-18
  • 打赏
  • 举报
回复
如果定义两个str1[]="hello world";
str2[]="hello world"; 数组那么str1 str2就是他们的存储地址,&str1 &str2 也是他们的存储地址 为什么呢 那么str1 str2 就不能当指针来看待了对吧?
wang2666 2011-03-18
  • 打赏
  • 举报
回复
cout<<&str1<<"\n"<<&str2<<endl; 输出的是两个不一样的地址值。

输出的是指针的地址,当然不一样。
指针保存的值才是字符串的地址
printf( "[%p][%p]\n" , str1 , str2 ) ;输出的值是一样的。
深渊冷凝 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]
摒弃cout;使用printf!
printf("str3=%p,str4=%p\n",str3,str4);

另外
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指……
[/Quote]
#include<stdio.h>
#include"iostream"
using namespace std;

int main(int argc, char* argv[])

{

char* str3 = "hello world";

char* str4 = "hello world";



if(str3 == str4)
{

printf("str3 and str4 are same.\n");
cout<<str3<<endl<<str4<<endl;
printf("str3=%p,str4=%p\n",str3,str4);


}

else

printf("str3 and str4 are not same.\n");



return 0;

}/*vc下的
str3 and str4 are same.
hello world
hello world
str3=0042F074,str4=0042F07
Press any key to continue
*/
a83736025 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]
摒弃cout;使用printf!
printf("str3=%p,str4=%p\n",str3,str4);

另外
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指……
[/Quote]
如果定义两个str1[]="hello world";
str2[]="hello world"; 数组那么str1 str2就是他们的存储地址,&str1 &str2 也是他们的存储地址 为什么呢 那么str1 str2 就不能当指针来看待了对吧?
a83736025 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lactoferrin 的回复:]
如果开了字符串池,str3=str4,否则不同
[/Quote]
如果定义两个str1[]="hello world";
str2[]="hello world"; 数组那么str1 str2就是他们的存储地址,&str1 &str2 也是他们的存储地址 为什么呢 那么str1 str2 就不能当指针来看待了对吧?
Lactoferrin 2011-03-17
  • 打赏
  • 举报
回复
如果开了字符串池,str3=str4,否则不同
a83736025 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 a83736025 的回复:]
引用 1 楼 delphiwcdj 的回复:
常量折叠

原理我懂 就是其实想问cout<<&str1<<"\n"<<&str2<<endl; 输出的是两个不一样的地址值。
这里有些模糊
[/Quote]
怎么求str的内存地址呢?
is2120 2011-03-17
  • 打赏
  • 举报
回复
指针变量本身也是一个变量,要把变量变量的地址和变量内存的地址分开

&str取的是str这个变量的地址,
文中所指的地址是str变量中存储的地址,这里就是str吧。

[Quote=引用 3 楼 a83736025 的回复:]

引用 1 楼 delphiwcdj 的回复:
常量折叠

原理我懂 就是其实想问cout<<&str1<<"\n"<<&str2<<endl; 输出的是两个不一样的地址值。
这里有些模糊
[/Quote]
a83736025 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 delphiwcdj 的回复:]
常量折叠
[/Quote]
原理我懂 就是其实想问cout<<&str1<<"\n"<<&str2<<endl; 输出的是两个不一样的地址值。
这里有些模糊
moorsf 2011-03-17
  • 打赏
  • 举报
回复
cout<<&str1<<"\n"<<&str2<<endl; 输出的是两个不一样的地址值。

这个你输出的是两个指针变量的地址,当然不一样。

if(str3 == str4)
这个判断就知道是不是一样了。
delphiwcdj 2011-03-17
  • 打赏
  • 举报
回复
常量折叠
赵4老师 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lactoferrin 的回复:]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

又是这段话
[/Quote]
谁让程序又(以下省略不计其数个‘又’)又让CPU执行捏?

为什么要有数据结构这个东东?
因为要将现实世界或者抽象理论中的各种数据保存在计算机外存(光盘、硬盘、U盘……)或内存(ROM、RAM、SRAM……)里面的一维二进制字节数组中。
然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。
加载更多回复(7)

70,024

社区成员

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

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