色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

指針可以指向什么內(nèi)存區(qū)域呢

指針可以指向什么內(nèi)存區(qū)域呢?

我們都知道指針C/C++的一大特色,但其實(shí)指針并不是C/C++獨(dú)有的,像C#和java等其實(shí)也是有指針的,只不過都被語(yǔ)言本身用其他的方式替代和封裝了一般程序員接觸不到,C/C++就不一樣,它是直接將指針暴露給開發(fā)者,因?yàn)榇蟛糠譅可娴街羔樀亩寂c內(nèi)存有關(guān),而計(jì)算機(jī)內(nèi)存很重要,萬(wàn)一出什么問題可能系統(tǒng)都會(huì)崩潰,下面我們就簡(jiǎn)單來看一下程序在運(yùn)行時(shí)指針與內(nèi)存之間到底是個(gè)什么樣的關(guān)系:

先看一段代碼:

#include <stdio.h>

#include <string>

#include <iostream>

#include <time.h>

using namespace std;

class people

{

public:

people();

~people();

string Name ;

int age ;

bool sex ;

char info[1024] ;

void run(){}

void eat(){}

private:

};

people::people()

{

}

people::~people()

{

}

int main()

{

people* p1 = new people();

cout<<p1<<endl;

cout<<&p1<<endl;

cout<<sizeof(p1)<<endl;

cout<<sizeof(*p1)<<endl;

system("pause");

return 0 ;

}

運(yùn)行看結(jié)果:

分析

接下來來一一進(jìn)行分析:

首先people* p1 = new people();這一句是類的一個(gè)實(shí)例化,系統(tǒng)會(huì)給people實(shí)例化一個(gè)對(duì)象*p并且給它在堆上開辟空間,注意是在堆上,開辟的空間用來存儲(chǔ)對(duì)象的數(shù)據(jù)。數(shù)據(jù)包括哪些?就是對(duì)象的屬性和虛函數(shù)指針,但是函數(shù)并不存儲(chǔ)在各對(duì)象中。因此run()和eat()方法是不存在對(duì)象*p指向的內(nèi)存處的。

cout<<p1<<endl;輸出的是00279360,這是一個(gè)地址,是系統(tǒng)給new people()對(duì)象分配的地址。

cout<<&p1<<endl;輸出的是0012FD90,這也是地址,但這是指針變量p本身的地址。

cout<<sizeof(p1)<<endl;

cout<<sizeof(*p1)<<endl;

通過這兩個(gè)我們就更清晰的認(rèn)識(shí)到了,p1本身只占用4個(gè)字節(jié)的空間,而他所指向的對(duì)象的地址所占的空間就很大,等于類中所有數(shù)據(jù)類型所占空間之和。

接下來我們?cè)趍ain函數(shù)里寫一點(diǎn)邏輯:

圖解

我們來看一下程序運(yùn)行時(shí)間,指針和內(nèi)存是怎么工作的。我畫一個(gè)圖給大家:

程序在運(yùn)行時(shí),數(shù)據(jù)主要是存儲(chǔ)在棧、堆、代碼區(qū)、全局區(qū)。代碼區(qū)主要就是存代碼中出現(xiàn)的一些字符常量、方法等,比如這里代碼中給對(duì)象的Name屬性賦的值“xiaoli”之類的都是存在此處,然后我們通過new出來的對(duì)象,都是由堆通過計(jì)算好類中各屬性所需空間然后開辟出來的。這里p3不是通過new開辟出來的,所以他是存在棧上的并且地址是固定的,是不能更改的,而p1和p2是能更改的。

改變地址

如此,我們?nèi)齻€(gè)對(duì)象互相賦值后會(huì)發(fā)生什么呢?

對(duì)比代碼和輸出結(jié)果我們發(fā)現(xiàn)了什么?賦值后p1和p2本身的地址并無改變,但是他所指向的內(nèi)存都編程p3所在的內(nèi)存了。下面用圖解給大家看一下:

注意,此處原來的p1和p2指向的內(nèi)存由于是new出來的我們需要手動(dòng)釋放它。所以我們?cè)谥匦沦x值之前要將這兩塊內(nèi)存刪除掉delete p2 ;delete p1;

改變地址的值

如果我將代碼中的 p2 = &p3;換成*p2=p3呢?我們看下輸出結(jié)果:

造成這種情況的原因,其實(shí)這就牽涉到指針的兩種賦值問題:一種是改變指向的地址,一種是改變本身指向地址的值p2 = &p3是改變指向地址,*p2=p3是改變指向地址的值。

java using,指針可以指向什么內(nèi)存區(qū)域呢