神一般的指標

2021-07-10 09:39:45 字數 2463 閱讀 6942

本篇部落格並不對指標的基本概念進行講述,而是針對指標常出現的一些理解誤區進行解析。

乙個指向整型資料的指標。

乙個指標的指標,它指向的指標指向乙個整型資料。**p 是 int 型別,所以 *p 是int *型別,即*p是乙個指向int的指標,所以p是乙個指向int的指標的指標。

乙個有10個指標的陣列,該指標指向整型資料。p[10] 的型別是 int *,所以 用type 替換 int *,也就是 type p[10],即p中每個元素都是type型別。

乙個指向有十個整型資料陣列的指標。()是為了當乙個整體看待,所以用val替換(*p),上式變為int val[10],所以*p 相當於陣列名(即陣列的首位址),所以p是乙個指向陣列(該陣列包含10個int數字)的指標。

就乙個函式(不是函式指標),該函式有乙個整型引數,返回值為乙個指向整型的指標

乙個有十個指標的陣列,該陣列中的指標指向乙個函式,該函式有乙個整型引數並返回乙個整型數。根據6,p[10]是乙個函式指標,所以p中每個元素都是乙個函式指標。

定義了乙個引數為int,返回值為int的函式指標,函式指標名是p。如果初始化了 p , 則可以通過 p( int ) 呼叫函式。

定義函式型別,p為型別名,該函式是接受乙個int引數,返回乙個int。注意與7.的區別。

根據如下**,引出問題:

const

int c = 5;

int * p = (int *)(&c);

*p = 6;

cout

<< c << endl;

cout

<< &c << endl;

cout

<< *p << endl;

cout

<< p << endl;

為什麼輸出的c是5,而*p是6呢,從位址上看,&c和p是一樣的。

解析:

首先需要明確的是,c的值其實已經變為6了。但是為什麼cout << c << endl;的時候,輸出的還是5呢?

**如下:

struct  ac

int c;

int& a;

};sizeof(ac); //等於8

經過測試,sizeof(ac) == 8;按照c++語法,引用是對一塊記憶體的別名,即引用不占用記憶體。但是這裡不佔記憶體的意思是,不佔物件空間,也就是不會申請另外一塊記憶體用於儲存10,然後讓a跟這塊記憶體關聯。這裡8位元組是因為有4位元組的int與4位元組的位址空間。因為標準並未明確表示怎麼實現引用,一般編譯器的做法就是儲存位址值,同指標的「實現」一樣。而指標一般是由4個位元組來儲存(這與編譯器和作業系統相關,測試用的是vs2013;linux環境是用8bytes儲存位址)。

為了進一步驗證上述的討論,**修改如下:

struct  ac

double c;

double& a;

};sizeof(ac);

按照上述討論,sizeof(ac) == 16;(c占用8bytes,a占用4bytes,還有4個位元組是因為記憶體對齊原則,補上的)。

以下是測試結果:

(ps : 可以通過在專案屬性中新增 命令列編譯選項/d1 reportsingleclasslayoutac ,使得在編譯期間顯示類的記憶體布局圖)。

小結 :

對於如下**:

double a = 10;

double & b = a;

這段**,在32bit系統中,記憶體中將會消耗12個bytes的記憶體,其中8bytes用於儲存a的值(10),4個bytes用於儲存b的值(a的位址),64bit系統中位址用8個位元組表示;儘管有如上特性,但是sizeof(b)的時候,編譯器將翻譯為求a物件所對應記憶體的大小。所以,一般情況下,引用只需要理解為是乙個物件名稱的別名(就當它是個名字而已),但是,切記引用也會消耗記憶體的,它所消耗的記憶體是用來儲存位址。

而真正意義上,引用就是指標。

以下**,來自 vs 2013,以下討論也是基於此編譯器。

int d = 10;

00417213 mov dword ptr [d],0ah

int & c = d;

0041721a lea eax,[d] //取d的位址,賦給暫存器eax

0041721d mov dword ptr [c],eax //

從上面**,我們可以清楚的發現,所謂引用,就是儲存乙個」被引用物件」的位址值。

我們再結合引用的性質,來看看:

神一般的C語言指標,你看懂多少?

今天閱讀 c c 程式設計師面試指南 中指標一塊,以前一知半解的指標問題頃刻間懂了。下面,可以做個測試,如果下面的指標問題你能夠全都解答正確,那麼你的c語言功底真是神一般的了。1.int p 2.int p 3.int p 10 4.int p 10 5.int p int 6.int p int ...

神一般的C語言指標,你看懂多少?

今天閱讀 c c 程式設計師面試指南 中指標一塊,以前一知半解的指標問題頃刻間懂了。下面,可以做個測試,如果下面的指標問題你能夠全都解答正確,那麼你的c語言功底真是神一般的了。1.int p 2.int p 3.int p 10 4.int p 10 5.int p int 6.int p int ...

Web Developer 神一般的FF外掛程式

如果你知道或者已經在用這個外掛程式了,可以拉到文章結尾處點 推薦 按鈕,然後再按ctrl w了,哈哈。正文開始 但今天偶爾機會認識了web developer,發現它的功能簡直碉堡了。因為功能實在太多了,而且都很實用,我無法一一介紹過來,所以下面我就挑幾個我覺得不錯的功能進行簡單介紹,更多功能就讓你...