指標是在32位系統下佔四個位元組,64位系統下佔八個位元組的一種型別,指標指向的內容可以是常量,變數,函式,結構體,指標本身,陣列,等等.
一級指標 一級指標常常在函式傳參時使用,可傳的引數有一維陣列,常量指標,函式指標等等都可以
但我們要注意不要在函式中,通過改變形參的指向來達到改變實參指向的效果,因為形參和實參只是兩個指向同一空間的不同的指標.但因為形參和實參指向的是同一空間,所以可以在形參中改變其指向空間的值,如此實參指向的空間位址也發生改變。
二級指標 二級指標可以用於傳遞指標陣列 char *arr[3]=;
這種用法可以通過二級指標進行傳參
void printfstr(char **arr);
陣列名在進行加減法,函式傳參時會隱式退化為指標,這個指標指向陣列的第乙個元素,但陣列名隱士退化的指標是常量指標,不能賦值.
指標陣列是陣列 它的定義方式為int*arr,也就是乙個陣列中存放的每個元素是指標,(實則不放指標也行), int *arr相當於int **arr.
陣列指標是指標,它的定義方式為 int(*arr),它也稱為行指標,我們通常賦值方式為
int arr[10] = ;
int (*p)[10] = &arr; 陣列指標加1跳過的是整個陣列,陣列指標解位址是陣列首元素位址
** char* pstr = "hello bit.";
特別容易讓同學以為是把字串 hello bit 放到字元指標 pstr 裡了,但 是/本質是把字串 hello bit. 首字元的位址放到了pstr中
#include
intmain()
這裡最終結果是
str1 and str2 are not same
str3 and str4 are same\n
這裡str3和str4指向的是乙個同乙個常量字串。
c/c++會把常量字串儲存到單獨的乙個記憶體區域,當幾個指標指向同乙個字串的時候,他們實際會指向同一塊記憶體。但是用相同的常量字串去初始化不同的陣列的時候就會開闢出不同的記憶體塊。所以str1和str2不同,str3和str4不同。
學了指標陣列和陣列指標我們來一起回顧並看看下面**的意思
int arr[5]
;int
*parr1[10]
;int
(*parr2)[10
];int(
*parr3[10]
)[5]
;
int arr[5];int型的一維陣列
int *parr1[10];int型的陣列指標
int (*parr2)[10];int型的指標陣列
*int (parr3[10])[5];int型的陣列指標陣列
陣列指標解位址是首元素位址指標
//總結:二維陣列傳參,函式形參的設計只能省略第乙個的數字。
//因為對乙個二維陣列,可以不知道有多少行,但是必須知道一行多少元素。
//這樣才方便運算
一維陣列
在一維陣列中,陣列名(必須是陣列名,不加方括號的)在進行在進行+ - 函式傳參操作中隱式轉化為指標
同理指標在進行【】後亦可以轉化為陣列(自己發現的)
書上理解是下標引用和間接訪問是對等的,這也解釋了為什要去掉方括號進行計算,因為去掉【】就由下標引用轉化為間接訪問了,而間接訪問是由指標操作完成。
驚人的結果:
int a[3]=;
printf("%d",2[a]);
return 0;
這裡的2【a】竟然是合法的,這是因為下標引用和間接訪問是等價的,下面是轉化規則
下標引用和間接訪問的轉化規則:括號外【括號內】=(括號外+括號內)
因此合法是因為2【a】=(2+a),a是陣列進行加減法時會隱式轉化為指標。
int a
指標, 指標的指標, 陣列, 指標陣列, 陣列指標
指標 int a 10 int p a 指標的指標 int b 20 int p b int p2p p 簡單陣列 int c 10 整數陣列,含有10個整數元素 也就是說每乙個元素都是整數 指標陣列 int p 10 指標陣列,含有10個指標元素 也就是說每乙個元素都是指標 陣列指標 int p ...
指標,陣列指標,指標陣列
1.指標 指標可以看成乙個變數,指標所佔記憶體的大小和處理器的定址空間大小有關,32位處理器指標大小為4個位元組,64位處理指標大小為8個位元組。int p 定義乙個int型別的指標,p就可以看成乙個變數,p的值為0,表示p指向0位址 p也是占用記憶體的,編譯器在棧上為p分配記憶體,儲存p的值0,0...
指標與陣列,指標陣列 陣列指標
int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...