注册 登录
编程论坛 C++教室

刚学,感觉很无助,请各位大神不要嫌弃我,帮帮我

异ren 发布于 2016-02-03 09:55, 2103 次点击
# include<iostream>
using namespace std;
int main()
{
    int add=3;
    int *p=&add;
    cout<<add<<'\t'<<p<<'\t'<<&p<<endl;
    return 0;
}//为什么p和&p不一样呢,就是说输出的结果不一样,难道p是地址,&p是地址的地址吗?地址也有地址的吗
3 回复
#2
九天冥盟2016-02-03 11:30
*p是指针变量,指针变量p储存的其他变量的地址,而&P代表指针变量自己的地址,通过*P可以调用被储存变量地址中的数值;即*P等价于add;
#3
天使梦魔2016-02-03 11:41
详细研究自己看操作系统原理。

一个变量有两部分组成,在内存里分成程序编码部分和运行部分,就是堆和栈。
简单点说就是系统加载exe后,把exe所有编码转换成机器码存放在内存里,这部分就是变量名,它有一个名字,或者说一个标签指向另外一个地址。(exe转换成机器码后是不会改变的,改变的是内容部分的区域)
而变量内容部分在另一个内存区域,它和名字是分开的。比如你定义一个结构或者数组,他们之间的内容部分是连在一起的,而不是中间夹杂名字。
当你重新改变某个变量的时候,操作系统会查询变量名字,然后再转到内容区域去修改。

这样一来,指针是可以修改的,它可以改变指向的地址,但在exe机器编码内部它的名字叫p,写程序的时候当然是呼叫p,当下面有呼叫p的时候系统肯定是先查询有没有p这个名字,然后才去查询它的值,发现是指针不是变量,然后按照指针方式处理,然后巴拉巴拉巴拉。。。。。。


嗯。。。为什么系统要把执行代码和内容代码分开来放?实际上解决一个很简单的问题,就是动态内存,每个系统都可以设置内存增长大小(一般是4k,设置过小消耗cpu,过大浪费内存,比如一次new一个char但增加了16k内存)
详情还是自己看操作系统原理的书
#4
yangfrancis2016-02-03 12:00
将*p,p和&p输出比对,多接触几次慢慢就明白了。自己悟出的比听人解答的理解更加深入。
1