变量不同,它们所指地址值相同?

w15650516 2011-09-01 11:12:24
问题1:变量不同,它们所指地址值相同?
eg:
#include "stdafx.h"
#include <iostream>
using namespace std;

int* foo(int *pm)
{
int static res;
res=*pm;
return &res;
}
int main()
{
int m1=1;
int m2=2;

if (foo(&m1)==foo(&m1)) //问题1:变量不同,它们所指地址值相同?
{
cout<<foo(&m1)<<endl;
cout<<foo(&m2)<<endl;
cout<<"相等";
}

}
----------------------------------------------------------------------------------------------------------
问题2:程序既然判断两个值相等,输出值又不一样:
#include "stdafx.h"
#include<iostream>
using namespace std;

int &foo(int a)
{
static int t;
t=a;
return t;
}
void _tmain(int argc, _TCHAR* argv[])
{

cout<<foo(1)<<endl;
cout<<foo(2)<<endl;

if (foo(1)==foo(2))
{
cout<<foo(1)<<endl; //输出 1
cout<<foo(2)<<endl; //输出 2 问题2:程序既然判断两个值相等,输出值又不一样。
cout<<"相等";
}
else
cout<<"不相等";
getchar();
}



...全文
326 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-09-01
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
lixing01 2011-09-01
  • 打赏
  • 举报
回复
//第一题,
返回的不是参数的地址,是int static res的地址,所以这个返回值是不变的

//第二题,
这个应该涉及到"=="的处理方式,foo(1)==foo(2)返回的是引用,实际上就是static int t,左右实际上指向同一个变量,做判断的过程中并不会保存临时变量,所以值是相同的,在随后的语句中foo(1) foo(2)重新进行了计算,所以数据不一样.

如果将代码改成如下:
#include "stdafx.h"
#include<iostream>
using namespace std;

int &foo(int a)
{
static int t;
t=a;
return t;
}
void main()
{

cout<<foo(1)<<endl;
cout<<foo(2)<<endl;

if (foo(1) + 1 == foo(2) + 1) //此时会保存临时变量,而不是直接比对t的值,所以为false
{
cout<<foo(1)<<endl; //输出 1
cout<<foo(2)<<endl; //输出 2 问题2:程序既然判断两个值相等,输出值又不一样。
cout<<"相等";
}
else
cout<<"不相等";
getchar();
}

这个可能要看一下编译原理,会有比较清晰的了解
lixing01 2011-09-01
  • 打赏
  • 举报
回复
foo()函数返回的该函数中静态变量res的地址,所以返回值永远是不变得.

cout<<foo(x) 输出的不是res地址,而是该地址指向的int数据类型的值,这个值是随着传入参数x变化的.

所以让你产生困扰的实际是cout的输出,当操作符<<加上(Int *)指针时,输出的是该指针所指向的地址存储的值,而不是该指针的地址.
fdoyy 2011-09-01
  • 打赏
  • 举报
回复
楼主,你问题1的foo函数中返回的是静态局部变量的地址,无论你调用多少次foo函数,静态局部变量还是那个。所以当然是相等的。你直接&m1==&m2这样子比较吧。
ouyh12345 2011-09-01
  • 打赏
  • 举报
回复
为什么要用static变量,直接判断不行吗?
morebread 2011-09-01
  • 打赏
  • 举报
回复
我就说一下第二个吧
其实你要注意foo函数的声明:int &foo(int a)。它返回的其实是static int t的地址,所以不管你传入什么参数,他返回的值都是一样的,因为t是static变量。
limang89 2011-09-01
  • 打赏
  • 举报
回复
int static res;

问题在static 先理解他的作用吧。。
lixing01 2011-09-01
  • 打赏
  • 举报
回复
这可能涉及到编译原理,简单来说 == 的计算,计算机编译为可执行文件后,到底是如何来计算 == 表达的值的.

假想如果是这样,程序计算左边的值取得一个结果保存在一个变量中,同样计算右边的值,最后对比2个变量的值是否相等并得出结果.

foo(1)==foo(2)的问题在于,左右2个值的结果都指向同一个变量,虽然foo(1),foo(2)单独计算结果不一样.但比对的时候实际上比对的同一个变量.结果自然永远是true
lixing01 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 w15650516 的回复:]
引用 5 楼 lixing01 的回复:
//第一题,
返回的不是参数的地址,是int static res的地址,所以这个返回值是不变的

//第二题,
这个应该涉及到"=="的处理方式,foo(1)==foo(2)返回的是引用,实际上就是static int t,左右实际上指向同一个变量,做判断的过程中并不会保存临时变量,所以值是相同的,在随后的语句中foo(1) foo(2)重新进……
[/Quote]

不是,我估计这涉及到c++对运算符以及表达式如何处理的问题.
举个例子:
int x = 1, y = 2;
if (x == y) //计算该表达式值的时候,程序应该是直接比对xy这2个变量所保存的值是否相等
if (x + 1 == y ++ 1) //计算该表达式值的时候,程序会计算x+1的值并保存在一个临时变量中,同样对y+1计算后也会保存在另一个临时变量中,然后比对这2个临时变量的值,计算完成后,这2个临时变量会自动销毁,这些临时变量的处理都是程序后台自动处理的.之所以采用临时变量,显然是因为x+1的值不能保存到x中,这样就会改变x的值,一般向函数传递参数(非引用类型的参数)也都是会生成临时变量的,这样就不会修改参数自身的值,也能很方便处理参数为表达式的情况.

回过来看你的题目,foo(1)==foo(2),程序先计算foo(1)的值,实际上就是t(这时候程序显然没有将foo(1)的结果保存到临时变量中),然后再计算foo(2)的值,在计算的过程中显然就改变了t的值,那么左边的结果实际上也改变了,无论如何左右的结果都是一样的.
如果是foo(1)+1==foo(2)+1,涉及到表达式了,左右的结果都会保存到临时变量中,所有右边的foo(1)再次调用函数时,左边的临时变量的值不会受到影响,所以为false
w15650516 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lixing01 的回复:]
//第一题,
返回的不是参数的地址,是int static res的地址,所以这个返回值是不变的

//第二题,
这个应该涉及到"=="的处理方式,foo(1)==foo(2)返回的是引用,实际上就是static int t,左右实际上指向同一个变量,做判断的过程中并不会保存临时变量,所以值是相同的,在随后的语句中foo(1) foo(2)重新进行了计算,所以数据不一样.

如果将代码……
[/Quote]

--第一题,我已理解。
--第二题,我按你所说理解如下:
1. ==操作符处理机制与赋值操作符处理机制不一样:==操作符判断的是左右两个引用是否相等,而不是判断左右两个引用的对象是否相等,对吗?
热爱生活 2011-09-01
  • 打赏
  • 举报
回复
顶。。。。。。。。
w15650516 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 morebread 的回复:]
我就说一下第二个吧
其实你要注意foo函数的声明:int &foo(int a)。它返回的其实是static int t的地址,所以不管你传入什么参数,他返回的值都是一样的,因为t是static变量。
[/Quote]
---它返回的应该是引用类型的函数吧?
K_THEKING 2011-09-01
  • 打赏
  • 举报
回复
围观!

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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