欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

怎樣熟練掌握C語(yǔ)言的指針

怎樣熟練掌握C語(yǔ)言的指針?

C語(yǔ)言指針就是這門(mén)語(yǔ)言的靈魂,說(shuō)難學(xué),那肯定是有難度的,畢竟這是業(yè)界公認(rèn)的。但是如果你熟練掌握了指針的話(huà),它又將會(huì)成為你手中的一柄利器。下面就詳細(xì)的分享一下指針該如何深入的去理解它以及如何熟練的應(yīng)用它

理解指針

首先,你需要掌握兩個(gè)運(yùn)算符“*”和“&”;

“&”運(yùn)算符:取對(duì)象在內(nèi)存中的地址

“*”運(yùn)算符:取內(nèi)存中地址上的對(duì)象(值);

大家一定要深刻的理解上面兩個(gè)運(yùn)算符,然后才能去進(jìn)一步理解指針;

int a = 100 ;這一行代碼我想大家都沒(méi)問(wèn)題。那么“&a”返回的就是對(duì)象(變量)a在內(nèi)存中的地址,它是一個(gè)16進(jìn)制數(shù)。

然后用“*”號(hào)去a的地址去取對(duì)象:“*(&a)”,,就能取到對(duì)象a,也就就是100 ;

接下來(lái)進(jìn)入重點(diǎn)了,指針,本身也是一個(gè)變量(對(duì)象),它本身占用內(nèi)存,但是它只存地址(別人的地址),它存的誰(shuí)的地址我們就稱(chēng)它為指向誰(shuí)的指針;

int* p = &a ;int* p_2 = new int(200) ;先不管他的類(lèi)型申明,只看變量本身p和p_2。前面講到指針存放的是對(duì)象的地址,那么可以理解為指針是一個(gè)地址變量,那么賦值的話(huà)就需要也賦一個(gè)地址給它一個(gè)地址。int* 和char*都可以表示地址類(lèi)型,它們的區(qū)別就是地址所存的值得類(lèi)型不同,一個(gè)是存整型,一個(gè)是存字符型;

對(duì)指針取值的話(huà),就是用“*”號(hào),后面接對(duì)象地址,也就是指針變量,所以*p和*p_2就分別是a和200;

指針的運(yùn)用

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

分析

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

首先people* p1 = new people();這一句是類(lèi)的一個(gè)實(shí)例化,系統(tǒng)會(huì)給people實(shí)例化一個(gè)對(duì)象*p并且給它在堆上開(kāi)辟空間,注意是在堆上,開(kāi)辟的空間用來(lái)存儲(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;

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

接下來(lái)在main函數(shù)里寫(xiě)一點(diǎn)邏輯:

圖解

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

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

改變地址

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

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

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

改變地址的值

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

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

java指針是什么意思,怎樣熟練掌握C語(yǔ)言的指針