C 指標詳解

2021-07-22 21:07:18 字數 3613 閱讀 5082

前言

今天發現自己對c++了解得還不夠深刻,毅然決定重新補充c++指標的知識。一直在論壇裡聽別人說沒有幾個人真正的會用指標,我居然懷疑了一下自己,好吧。惡補唄,順便寫篇部落格祭奠一下,這篇文章適合非小白看,我只是把容易錯的點補充了。

1.資料在記憶體中是如何儲存的

在編譯時就會系統就會給變數分配記憶體空間,這裡有個概念必須理清,就是記憶體單元位址跟記憶體單元內容,在編譯期間,變數實際上已變成記憶體單元位址(就0xyyyyy)之類的,然後系統根據位址找到記憶體單元內容,如定義了變數int i=100;i的記憶體單元內容就是100。

2.指標和指標變數的概念

上述查詢i的內容是直接尋值,還有一種是間接尋值,即有一種特殊變數是用來存放某個變數的記憶體單元位址。該特殊變數的值稱之為指標(其實某個變數的位址就是指標)。
3.定義指標變數及其概念

int *pointer_01; 

上述所定義的指標變數是指向整型資料的指標變數。也就是說,指標變數pointer_1只能指向整型的變數,一般定義指標的形式:基型別 *指標變數名。

請各位注意,*並不是該指標變數的變數名,在變數名前加*只是為了說明該變數是指標變數。

我的電腦輸出結果為:007ff824---007ff824---100

int* pointer_01;

int a=100;

pointer_01=&a;

cout

<

<

<

\\&是取位址的符號

\\我的電腦輸出結果為:0097f874---100---0097f874---0097f880

每個人執行的結果前兩個值都會相同,說明了pointer變數的記憶體單元內容是a的位址,pointer是變數,所以有自己的記憶體單元位址,用*引用pointer變數的記憶體單元內容即可找到真正的值。到這,我回想了一下,我之前確實誤解了指標的真正含義,如果不經常用真的很容易把概念混淆。
4.指標作為函式引數

例如:函式do(int *point_01),定義了變數:int *point_01,i我們呼叫是傳得是位址即point_01,&a等,千萬不用傳*point_01,因為人家需要的是位址,加*號就指向了a的內容即100了。
5.指標與陣列

指向一維陣列的指標

陣列因為記憶體中是順序存放的,當指標指向陣列某乙個位置時,通過加減移動指 針就可以訪問陣列中的元素,陣列名字預設是陣列首位的位址。

例如: int a[5];int *point_01=a;point_01+1==a[1];

指向二維陣列的指標

用單個指標引用二維陣列考慮陣列在記憶體中的存放情況即可。

#include 

using

namespace

std;

int main( )

;int *p; //p是基型別為整型的指標變數

for(p=a[0];p0]+12;p++)

cout

<

return

0;}

當用指標陣列引用二維陣列要注意的是,指標陣列的增值是以一維陣列為單位,想要任意訪問二維陣列中任一元素,應該這麼寫:定義了point_01[n],   用*(*(point_01+i)+j)訪問i行j列。
6.字串與指標

字元指標不同與整形指標,字元指標可以初始化。輸出也不一樣,具有一定的特殊性,待我慢慢說道。我們先理清一下概念:

1. 輸出指標的內容(即所指向空間的位址)cout<7.指標陣列和指向指標的指標

指標陣列:一般的定義形式為型別名*陣列名[陣列長度];在這個陣列裡每位元素都是指標。

但是我們要區別清楚:

int *p[4]------這是指標陣列。

int (*p)[4]---------這是陣列指標。

這倆位仁兄長得實在太像,平時我特別容易混淆,但它倆卻大不相同。果然,c++都是坑,慢慢填吧。

指標陣列是乙個只存放定義型別的指標的陣列。

陣列指標是乙個指標,只能指向定義型別的陣列。

8.指向指標的指標

我的天,看到這個標題我腦子飛速饒了幾圈,媽呀,指標都夠煩了,還要☞中☞,要是真想在專案中玩起來,估計得有些修行。

在理解前面指標陣列的基礎上,我們再來看指向指標的指標。不說廢話,先上到菜。

#include 

using

namespace

std;

int main( )

;p=name+2; //見圖6.23中p的指向

cout

<

cout

<

}//輸出結果為:

//c++

//c

解析:字元指標陣列是乙個指標陣列,裡面的元素name[i]都是指標==位址,陣列名name代表該指標陣列首元素的位址。name+i是name[i]的位址,所以p=name+2是合法的。指標-指標==位址-位址,這種方法就多級間接訪問,下面配個圖方便理解。

9.指標總結

希望大家認真複習指標,看見下圖中的每乙個定義要能迅速想起對應的概念

10.引用

順便說說引用的意思跟引用和指標的區別。

引用的概念:

int a; //定義a是整型變數

int &b=a; //宣告b是a的引用

引用只是乙個變數的別名

引用和指標的相同點:

(1)都是指標的概念

只不過指標的內容是某塊記憶體的位址,引用是某塊記憶體的別名。

不同點:

1. 指標是乙個實體,而引用僅是個別名;

2. 引用使用時無需解引用(*),指標需要解引用;

3. 引用只能在定義時被初始化一次,之後不可變;指標可變;

引用「從一而終」 ^_^

4. 引用沒有 const,指標有 const,const 的指標不可變;

5. 引用不能為空,指標可以為空;

6. 「sizeof 引用」得到的是所指向的變數(物件)的大小,而「sizeof 指標」得到的是指標本身(所指向的變數或物件的位址)的大小;

typeid(t) == typeid(t&) 恒為真,sizeof(t) == sizeof(t&) 恒為真,但是當引用作為成員時,其占用空間與指標相同(沒找到標準的規定)。

7. 指標和引用的自增(++)運算意義不一樣;

C 指標詳解

指標是乙個特殊的變數,它裡面儲存的數值被解釋為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者指標所指向的記憶體區,還有指標本身所佔據的記憶體區。去掉宣告中指標的名字,剩下的就是指標的型別。例如 int ptr 指標的型別是int char p...

詳解C指標

指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體 使用者空間的虛擬記憶體 裡的乙個位址。乙個指標包含四個方面的內容 指標的型別 指標所指向的型別 指標所指向的記憶體區 指標本身所佔據的記憶體區。接下來就下面幾個例子作說明 1 int p 2 char p 3 int p 4 int p 3 5...

C 指標詳解

最近幾天正在進行自考c 課程的學習,在做卷子的時候,遇到了好幾次指標的問題,讓我很是頭大,現在我就給大家分享一下我的收穫吧,也算是對自己的乙個總結和提公升吧!首先我們得知道指標是用來指向乙個位址的東西,在程式設計的時候,我們常常有這樣的操作int a 5,這樣寫系統會自動的在記憶體裡邊建立乙個a型別...