C++指针的内存分配

我不知道现在的编译器是不是都这么做的。

但是今天发现了指针对内存的方式。

#include <iostream>
using namespace std;

int main()
{
    int n = 44;
    cout << "n = " << n << endl;
    cout << "&n = " << &n << endl;
    int *pn = &n;
    cout << "pn = " << pn << endl;
    cout << "&pn = " << &pn << endl;
    cout << "*pn = " << *pn << endl;
    int **ppn = &pn;
    cout << "ppn = " << ppn << endl;
    cout << "&ppn = " << &ppn << endl;
    cout << "*ppn = " << *ppn << endl;
    cout << "**ppn = " << **ppn << endl;
   
    system("pause");
    return 0;
}

这一段程序,有两个结果。

&n、&pn、&ppn正向增长。从&n的0x0064fd78增长到&pn的0x0064fd7c,再到&ppn的0x0064fd80。

这个说明了编译器是顺序分配空间的。

但从我现在用的来看,&n是0x22ff74,&pn是0x22ff70,而&ppn是0x22ff6c,这里看出是反向增长的。

如果是反向的话,就还要考虑新开一个程序声明的变量是怎么分配的。

#include <iostream>
using namespace std;

int main()
{
    int n = 44;
    cout << "n = " << n << endl;
    cout << "&n = " << &n << endl;
    int *pn = &n;
    cout << "pn = " << pn << endl;
    cout << "&pn = " << &pn << endl;
    cout << "*pn = " << *pn << endl;
    int **ppn = &pn;
    cout << "ppn = " << ppn << endl;
    cout << "&ppn = " << &ppn << endl;
    cout << "*ppn = " << *ppn << endl;
    cout << "**ppn = " << **ppn << endl;
   
    int m = 55;
    cout << "m = " << m << endl;
    cout << "&m = " << &m << endl;
    int *pm = &m;
    cout << "pm = " << pm << endl;
    cout << "&pm = " << &pm << endl;
    cout << "*pm = " << *pm << endl;
    int **ppm = &pm;
    cout << "ppm = " << ppm << endl;
    cout << "&ppm = " << &ppm << endl;
    cout << "*ppm = " << *ppm << endl;
    cout << "**ppm = " << **ppm << endl;
   
    system("pause");
    return 0;
}

&n = 0x22ff74;

&pn = 0x22ff70;

&ppn = 0x22ff6c;

&m = 0x22ff68;

&pm = 0x22ff64;

&pm = 0x22ff60;

这里是反向的。

#include <iostream>
using namespace std;

int main()
{
    int n = 44;
    cout << "n = " << n << endl;
    cout << "&n = " << &n << endl;
   
    int m = 55;
    cout << "m = " << m << endl;
    cout << "&m = " << &m << endl;

    int k = 66;
    cout << "k = " << k << endl;
    cout << "&k = " << &k << endl;
   
    system("pause");
    return 0;
}

n = 44

&n = 0x22ff74

m = 55

&m = 0x22ff70

k = 66

&k = 0x22ff6c

还是向下增长。

这个说明变量分配或者指针分配都是向下增长的。另外不管运行多少次、编译多少次,不管第一个编译的变量是什么名字,都是以0x22ff74开头。这个说明0x22ff74是该段内页的首地址。而ox22ff70则可以给别的名字。这个是跟计算机操作系统有关的知识(段和页的知识)。

另外还要注意名字跟变量是不一样的。区别引用和指针,引用就是一个变量名,编译器编译时会整理出变量符号表,这个引用和被引用,这两个名字都会登记在里边,但是他们指向同一个内存地址。而指针是不一样的。指针就是一个普通变量,但是变量存储的是别的变量的内存首地址。这个用&就可以明白。&引用是值使用的内存空间地址。指针是值使用使用内存空间地址。&指针是变量的内存空间,存储值使用使用内存空间地址。这个归纳为名称和指针吧,是跟编译器的实现有关的,见编译原理。

 

声明引用:
int &rpn = *pn; // 这里给rpn赋值的是变量名。默认&rpn就是&(*pn)。即pn所指的内存。
int *pn = &n; //这里给pn赋值的是地址。
默认pn的值就是&n。即*pn才是n。

//简单 熟悉。

现在的编译器禁止了引用数组和数组引用。这个要注意。但是要理解参数中的引用,参数中的引用实际传的内存中该变量第一个字节的地址,参数认为它不是引用数组,或者数组引用,因为它不关心大小,默认为1个类型大小的引用。所有参数中可以int function(int &, int).

 

 

#include <iostream>
using namespace std;

int main()
{
    int a = 2;
    int *p = &a;
    cout << "a = " << a << endl;
    cout << "p = " << p << endl;
    int *pp;
    cout << "pp = " << pp << endl;
    cout << "*pp = " << *pp << endl;
    p -= 1;
    p = &a;
    cout << "p = " << p << endl;   
    cout << "*pp = " << *pp << endl;
    system("pause");
    return 0;
}

a = 2
p = ox22ff74
pp = 0x22ffa8
*pp = 0
p = 0x22ff74
*pp = 0
这里pp的声明掉入了下一页

反应段和页的关系。是操作系统控制的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值