指標相關概念

2021-09-10 05:35:19 字數 3369 閱讀 6079

2. 指標之間的運算

3. 二級指標

4. 函式指標

5. 結點定義之指向自身的指標

int

*p,*q;

//p,q都是指標

int*p,q;

//p是指標,q不是

int

*p =

&a;int

*p2 = p;

//p, p2兩個指標指向的是同一塊記憶體空間,他們中存放的都是a的位址

null 在 c 標準庫標頭檔案 stddef.h 中定義

*#define null ( (void )0 )

顯然,這是乙個巨集定義。null 實際上是((void*)0) ,容易看出,外層的括號純粹是為了防止歧義;裡層的括號則是強制型別轉換,轉換成 void * 型別,本來 void * 型別是位址,那麼這裡的 0 自然就是位址 0 。

就是把位址 0 轉換成指標型別,稱為空指標,它的特殊之處在於,作業系統不會把任何資料儲存在位址 0~0xfff (這段位址是受系統保護的)的頁面對映到物理記憶體,所以任何對位址 0 的訪問都會立刻導致段錯誤

未初始化、或者說指向無效記憶體空間(已經進行free釋放)的指標都叫做野指標

/*****指標變數加減乙個整數*****/

int*p =

&a;p = p +1;

p++、p--,

p+1 的結果實際上是當前位址增加 0x0004;增加的數值和 p 所指向的資料型別是有關的,如果 p 指向的是 char 型,那麼加 1 的結果就是當前位址增加 0x0001;

自增就是加 1,當前位址增加 0x0004;自減是當前位址減去 0x0004,如果 p 指向的是 char 型,則減去 0x0001。

/******指標相減執行******/

#include

intmain()

執行結果依次是1,4,32。

0x0015 - 0x0010 = 0x0005,5位元組可以存放 1 個整型數。

0x0020 - 0x0010 = 0x0010,16位元組可以存放 4 個整型數。

0x0030 - 0x0010 = 0x0020,32位元組可以存放 32 個字元。

有此推斷:指標相減的結果是這塊位址空間最大可以存放的對應資料型別的資料個數。

*p++ 可以拆分成兩個語句,即 *p 和 p++。

#include

intmain()

;int

*p = a;

int c =

*p++

;//先取p中的值,然後p++,這個p++在執行完語句後才會生效,所以c是1

int d =

*p;//++之後p指向a[1],所以是2,

int f =

(*p)++;

//(*p)++,先取值,再++,p還是指向a[1],只是裡面的值加加變為3, ++就相當於取出這個值增加1在放回去可以輸出a[1]的值,結果是3

printf

("%d %d %d\n"

,c,d,f)

;printf

("%d\n"

,*p)

;}

執行結果:

1 2 2

3

禁止對自定義位址的寫操作

#include

intmain()

執行結果:

lh@ubuntu:~/1221$ ./a.out

0x800000 0x80484e7

將 16 進製數強制轉換為指標賦給 p,但是這個位址不能寫。

由於無法確定某位址是否在使用中,所以對自定義位址寫資料是很危險的,最糟糕的情況可能造成系統崩潰,所以大部分編譯器不允許這種行為。

通過傳參修改變數的值,需要直接對變數對應的記憶體(也就是位址)進行操作,那麼傳指標就可以。如果要修改指標本身的值,那麼就需要對指標本身對應的記憶體操作,也就是二級指標。

如果只是傳變數(不管是指標變數還是整型變數),都只是拷貝乙個副本,不會對原資料進行修改。

所以可以問問自己,如果我需要在傳參的同時對指標變數的值進行修改,那麼我就需要使用二級指標。

演示程式:

#include

#include

void

test1

(char

**p,

int n)

void

test2

(char

*p,int n)

intmain()

執行結果:

00f178a8 //原來的p被修改

00f178a8

00f17938 //原來的p未改變

00000000

#include

intmax

(int a,

int b)

intmain()

有點類似於 typedef 給函式名起乙個別名。

c++ 中用類定義結點,c 語言中用結構體,細節是相似的。

class

node

;

為什麼需要指向自身的指標作為資料成員?

首先不管是 c 語言還是 c++ 中,如果想在記憶體中將相同型別的記憶體區域鏈結起來,不管是鍊錶,還是樹(二叉樹,森林等),或者是圖,都需要使用指標在做到指向的作用。那麼問題來了,int型的記憶體區域有 int 型的指標,float 有 float 型的指標,那 c 中結構體,或者是 c++ 中類的記憶體有什麼樣的指標呢?對了!就是結構體或者是類的指標

其次,因為類中使用類的指標的作用是希望可以指向下一塊記憶體。所以在鍊錶中有乙個或兩個(如果是雙向鍊錶就是倆)類指標,如果二叉樹中就有兩個或者四個(如果是線索二叉樹就是四個)類的指標。這個指標是類的私有成員,當然要放在類中去申明嘍。

深度理解指標及相關概念

2.指標變數 指標變數是變數,具有儲存空間。就像int,float等型別一樣,當然,指標有別的變數不具有的特殊用法。1.指標的型別 我們將type 叫做指標的型別,type指的是指標所指向的型別,type是指最後乙個 之前所有的東西,例如 char p,它的type部分就為char char p,它...

C語言 指標相關概念理解

程式舉例 例子 抽屜a,抽屜a裡面存放這乙個字母,這個抽屜裡面的字母對應另外乙個抽屜。此致a這個符號可以稱為位址,也就是指標,而a裡面的字母稱為指標變數。int a a為指標變數,改變a就能改變指標所指向的單元,所以a賦值內容為位址,即a b 意思就是指標指向了b位址這個單元 此時 a等同於b 這種...

Lodrunner相關概念

1.集合點 集合虛擬使用者,以便於準備好使用者,一致在某個時刻執行任務 在某個時間把需要虛擬的使用者數目準備好 如何新增集合點 設定指令碼執行場景時,也可以對集合點策略進行相應配置 2.事物 事物是用來度量伺服器響應事物的時間。乙個完整任務有開始,結束 插入事物方式有2種 事物狀態有3種 lr pa...