求助,c++练习中指针指向的值不变指针本身却莫名改变

epthar 2018-03-20 06:43:27
直接上代码
int a = 10;
int b = 9;
int *p(&a);
int *c(&b);
cout << p << endl;

int a = 10;
int b = 9;
int *p(&a);
cout << p << endl;
int *c(&b);
int *t = c;


就这很简单的代码,输出的p的值却不同,哪位大神能分析一下为什么两个输出结果不同。
...全文
719 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlbertS 2018-03-26
  • 打赏
  • 举报
回复
引用 14 楼 a34140974 的回复:
[quote=引用 10 楼 shihengzhen101 的回复:] 看注释

int a = 10;                         
 int b = 9;
 int *p(&a);
 int *c(&b);
 cout << p << endl;

 int a = 10;
 int b = 9;
 int *p(&a);
cout << p << endl;
// p变量是a的地址,与下面的给c和t赋值没有关系,即使下面的代码注释掉,p的值可以一样,有可能不一样
 int *c(&b);
 int *t = c;
肯定不一样哦[/quote] 为什么肯定不一样啊,这明显就是两段代码,分别运行有可能一样吧,只是概率比较小
月凉西厢 2018-03-26
  • 打赏
  • 举报
回复
引用 10 楼 shihengzhen101 的回复:
看注释

int a = 10;                         
 int b = 9;
 int *p(&a);
 int *c(&b);
 cout << p << endl;

 int a = 10;
 int b = 9;
 int *p(&a);
cout << p << endl;
// p变量是a的地址,与下面的给c和t赋值没有关系,即使下面的代码注释掉,p的值可以一样,有可能不一样
 int *c(&b);
 int *t = c;
肯定不一样哦
赵4老师 2018-03-23
  • 打赏
  • 举报
回复
学会使用数据断点:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
Saleayas 2018-03-22
  • 打赏
  • 举报
回复
为什么要相同呢?
考拉一枚 2018-03-22
  • 打赏
  • 举报
回复
这里的两个p指向的是栈上随机分配的两个地址,这两个地址本身在一开始就是不同的,只是这两个地址里装的值相同而已
lyflyf1999 2018-03-22
  • 打赏
  • 举报
回复
你们的p指针指向的是a的地址啊,两段程序定义a的时候a的地址不一样啊 你 cout<<*p<<endl; 这样才是取a的值
  • 打赏
  • 举报
回复
引用 3 楼 epthar 的回复:
我的意思是 c 和 p 有什么关系,为什么将 c 赋给 t 会导致 p 地改变
肯定不会。。。你观察的有问题。。。
AlbertS 2018-03-22
  • 打赏
  • 举报
回复
看注释

int a = 10;                         
 int b = 9;
 int *p(&a);
 int *c(&b);
 cout << p << endl;

 int a = 10;
 int b = 9;
 int *p(&a);
cout << p << endl;
// p变量是a的地址,与下面的给c和t赋值没有关系,即使下面的代码注释掉,p的值可以一样,有可能不一样
 int *c(&b);
 int *t = c;
  • 打赏
  • 举报
回复
引用 3 楼 epthar 的回复:
我的意思是 c 和 p 有什么关系,为什么将 c 赋给 t 会导致 p 地改变
按你的逻辑,下面的程序,两次输出的值(不是程序启动两次)应当是不同的,但结果是相同的。

#include <iostream>

using namespace std;

int main()
{
// 	int a = 10;                         
// 	int b = 9;
// 	int *p(&a);
// 	int *c(&b);
// 	cout << p << endl;

	int a = 10;
	int b = 9;
	int *p(&a);
	cout << p << endl;
	int *c(&b);
	int *t = c;
	cout << p << endl;
	return 0;
};

linux_hsylar 2018-03-22
  • 打赏
  • 举报
回复
引用 1 楼 zjq9931 的回复:
变量的声明是在栈内存中的。 两个程序的栈是不同的,声明c的位置不同。所以值肯定是不同的。 最好的办法就是看汇编代码了。
+1
qq_34644914 2018-03-21
  • 打赏
  • 举报
回复
你就算把下面部分注释掉只输出上一部分的p每次都不一样的,都是系统自动分配的 ,懂了吧 程序运行,系统给变量分配内存空间。程序结束,这内存空间就被收回了的。 这个空间是随机分配的。 也不可能固定,因为变量可以定义无数个、而计算机内存是有限的,假如每个变量都给它一个固定的内存空间,那么计算机内存也必须是无限大咯。
epthar 2018-03-21
  • 打赏
  • 举报
回复
我的意思是 c 和 p 有什么关系,为什么将 c 赋给 t 会导致 p 地改变
真相重于对错 2018-03-20
  • 打赏
  • 举报
回复
首先你要理解 int *p(xxx)这个代表什么意思?
  • 打赏
  • 举报
回复
变量的声明是在栈内存中的。 两个程序的栈是不同的,声明c的位置不同。所以值肯定是不同的。 最好的办法就是看汇编代码了。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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