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

C語言指針怎樣快速掌握

謝彥文2年前14瀏覽0評論

C語言指針怎樣快速掌握?

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

理解指針

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

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

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

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

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

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

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

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

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

指針的運(yùn)用

指針并不是C/C++獨(dú)有的,像C#和java等其實(shí)也是有指針的,只不過都被語言本身用其他的方式替代和封裝了一般程序員接觸不到,C/C++就不一樣,它是直接將指針暴露給開發(fā)者,因?yàn)榇蟛糠譅可娴街羔樀亩寂c內(nèi)存有關(guān),而計(jì)算機(jī)內(nèi)存很重要,萬一出什么問題可能系統(tǒng)都會崩潰,下面就簡單來看一下程序在運(yùn)行時(shí)指針與內(nèi)存之間到底是個什么樣的關(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();這一句是類的一個實(shí)例化,系統(tǒng)會給people實(shí)例化一個對象*p并且給它在堆上開辟空間,注意是在堆上,開辟的空間用來存儲對象的數(shù)據(jù)。數(shù)據(jù)包括哪些?就是對象的屬性和虛函數(shù)指針,但是函數(shù)并不存儲在各對象中。因此run()和eat()方法是不存在對象*p指向的內(nèi)存處的。

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

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

cout<<sizeof(p1)<<endl;

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

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

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

圖解

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

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

改變地址

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

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

注意,此處原來的p1和p2指向的內(nèi)存由于是new出來的我們需要手動釋放它。所以我們在重新賦值之前要將這兩塊內(nèi)存刪除掉delete p2 ;delete p1;

改變地址的值

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

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

java怎么表示指針,C語言指針怎樣快速掌握