C語言第八講,指標

2022-03-20 20:36:17 字數 2933 閱讀 1888

說到指標,很多人都說是c語言的重點. 也說是c語言的難點.

其實指標並不是難.而是很多人搞不清位址 和 值.以及指標型別.

為什麼這樣說.

假設有兩個變數,如下

int nnum1 = 1

;int nnum2 = 0x00401000;

變數nnum1 儲存的值是1

變數nnum2 儲存的是乙個16進製制數值.

那麼如果我們把儲存16進製制的這個變數.當作指標. 也就是說它儲存了乙個16進製制數值而已. 我們可以通過16進製制找到裡面儲存的值.

但是因為是儲存位址的變數.所以我們需要加上特殊符號進行定義.

例如:

int *nnum2 = 0x004010000;
指標其實就是儲存了乙個特殊的數值而已. 而通常這個數值我們說是位址.

如果我們儲存了1的位址,那麼我們就可以訪問1了.

怎麼訪問?

可以通過取內容符號進行訪問.

int nnum = 1

;int *p = &nnum1; //

儲存1的位址,我們可以不用管.也可以理解為乙個16進製制數值而已.

*p = 3; //

修改位址空間的值.

說到指標.其實我們說的並不是儲存位址的難點.難點是該如何解釋這個位址.

例如我們知道定義乙個變數.我們可以知道這個變數的記憶體空間跟隨這資料型別走.

例如:

int nnum1 = 3;  //

nnum1 大小是4個位元組. 則 sizeof(nnum1) = 4;

short

int nnum2 = 2; //

nnum2 大小是2個位元組. 則sizeof(nnum2) = 2;

....

那麼我們指標其實也一樣.也和普通變數一樣.

int nnum1 = 2

;int *p = &nnum1; p的大小也是4個位元組. 跟位址無關.

比如我們定義指標的是否有很多資料型別解釋.

例如:

int *p;

short *p;

double *p;

那麼位址解釋的方式也就不一樣.

根據上圖可以得知,1所佔的記憶體空間是4個位元組,而不同的型別則有不同的解釋方式.

如果解釋為short *,則獲得的是1的高位,如果解釋為int *則是整個的1所代表的值.

指標和我們普通變數運算不一樣.

普通變數進行運算

int nnum1 = 1

;nnum1 ++; //

nnum1 = 2;

指標變數進行運算

int *p = 0x00401000

;p++; 則p的值是0x00401004;

因為我們的型別是

int *解釋方式,所以每次+1則是加乙個int型別大小.而因為指標就是位址.

所以+1的時候就是+4

指標相減也是一樣的.

學習了指標,就要說下指標應用的場合. 陣列和指標一般是很常見的.

例如定義陣列:

int nnum1[10] = ;
指標可以進行訪問陣列.

int *p = nnum1; //

注意,陣列是乙個資料結構.所以我們不用加取位址符號.陣列名就是陣列的首位址.

如果我們是變數,則需要加上&符號.

例如:

int n = 10

;

int *p = &n;

指標進行訪問:

*p = 10; //

陣列元素的第一項更改為10

p++; //

指標++,根據資料型別來相加,+1等於+4,則到陣列的第二個元素了.

一般遍歷陣列的時候我們會封裝成乙個函式.

則會寫成下面這樣.

void iteratorarr(int *p, int

count)

puts(

"\r\n");

}int

main()

; iteratorarr(arr,

sizeof(arr)/sizeof(arr[0

]));//傳入陣列首位址即可.但是我們函式的引數要定義為指標. 還需要傳入陣列的個數.進行遍歷.

system(

"pause");

return0;

}

輸出結果.

指標一般也用於函式的傳參.例如上面我們遍歷陣列.其中我們的函式的形參就是指標.

void changevalue(int *p, int *p1)

intmain()

輸出結果.

函式指標.

指標的高階應用還有函式指標. 就是我們定義乙個指標. 這個指標是函式指標.可以指向自己定義的乙個函式.

函式名字就是函式的首位址.

例如:

void changevalue(int *p, int *p1)

intmain()

輸出結果.

函式指標的語法

函式返回值 (*  指標變數名)(函式引數)
函式指標其實很好定義,只需要把函式的宣告拿過來,然後函式名字前邊加上括號. 括號裡面加上*就可以了.

第八講 友元

include include class point int getx int gety friend float dist point a,point b private 私有資料成員 int x,y float dist point a,point b int main class a pri...

go第八講 函式

第一講的時候,我們其實就已經使用到了函式 main函式,不知道大家注意沒有 func function name parameter list return types 函式定 析 func 函式由 func 開始宣告 function name 函式名稱,函式名和引數列表一起構成了函式簽名。par...

mongoDB第八講 分片

1.插入負載技術 分片架構圖 2.片鍵的概念和用處 看下面這個普通的集合和分片後的結果 利用key為片鍵進行自動分片 3.什麼時候用到分片呢?3.1機器的磁碟空間不足 3.2單個的mongodb伺服器已經不能滿足大量的插入操作 3.3想通過把大資料放到記憶體中來提高效能 4.分片步驟 4.1建立乙個...