說到指標,很多人都說是c語言的重點. 也說是c語言的難點.
其實指標並不是難.而是很多人搞不清位址 和 值.以及指標型別.
為什麼這樣說.
假設有兩個變數,如下
int nnum1 = 1變數nnum1 儲存的值是1;int nnum2 = 0x00401000;
變數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建立乙個...