首先我們需要理清指標與陣列的關係:陣列不等於指標,但在某些情況下二者等價。
定義乙個一維陣列int a[i] = ;
,當我們使用a[i]
的時候,實際上編譯器做了轉換處理,變成了*(a+i)
。
一維陣列是方便理解的,那麼二維陣列呢?
a[i][j]
與*(*(a+i)+j)
具有等價效果,對後者分析如下:
a表示二維陣列中第一行的位址,a+i則表示第i+1行的位址
*(a+i)表示第i+1行的列位址(這個列為第一列),*(a+i)+j則表示第i+1行、第j+1列的位址
*(*(a+i)+j)表示取出這個位址上的資料
有了這個鋪墊,我們就可以愉快的開始下面的旅程了。
前面說到在指標函式中,return的時候注意不要是區域性變數的位址,這句話本身是有瑕疵的。但如果就這樣做了,保準兒程式不會出錯。但是等一等,我們需要這般畏首畏尾嗎?
與「猥(畏)瑣(縮)」說不!
一般說來,存放在棧中的變數不可以被return位址。這是由於棧中的資料由系統產生,也由系統**,很難說我們在return棧中的某個資料的位址時,系統是不是早一步把它乾掉了。
但這幾個資料是可以的:全域性變數,靜態變數,常量資料,堆中的資料。乙個執行的程式裡,這些資料並不存放在棧中,具體在**涉及到記憶體分配的問題,這裡不做延伸了。
函式指標的根本是指標,它能夠指向乙個函式。
定義:int (*p)(int, int);
表示p是乙個能夠指向函式的指標,並且它指向的函式是int型別,且這個函式有兩個引數,這個兩個引數都是int型別。
#include
intadd_xy
(int x,
int y)
intmain
(int argc,
char
**agrv)
// 輸出
>>
3
舉一反三:char *(*p)(int, char *)
表示p是乙個指向函式的指標,這個函式有兩個引數:乙個int型別,乙個char*型別(char*的指標),並且這個函式返回char *的指標
一定要區分:char *p(int, char *)
,當沒有小括號把指標運算子和指標變數包起來的時候,表示指標函式的宣告,函式的名字為p
指標陣列的根本是陣列,即:乙個陣列裡的成員都是指標
定義:int *p;
按照優先順序順序,這裡p
是乙個整體,所以可以看作:int *
—>p
示例:
#include
intmain
(int argc,
char
**agrv)
;// 定義乙個指標陣列,並且初始化
int i =0;
for(i=
0;i<
3;i++
)return0;
}// 輸出
>>
1>>
2>>
3
陣列指標的根本是指標,即:乙個指向陣列的指標
定義:int (*p);
按照優先順序順序,*p
是乙個整體,所以可以看作int *p
—>
示例:
#include
intmain
(int argc,
char
**argv),,
};int(
*p)[3]
= a;
// 定義乙個陣列指標,並且初始化
int i =
0, j =0;
int row =
3, col =3;
for(i=
0; ireturn0;
}// 輸出
>>12
3456
789
定義:int *const p;
指標(*)常量(const),也就是說指標運算子在const的前面;const修飾的是p,所以p不能被賦值
#include
intmain
(int argc,
char
**argv)
// 輸出
>>
1>>
2
定義:int const *p;
常量(const)指標(*),也就是說,const在指標運算子的前面;並且可以看做const 修飾的是*p,所以*p不能被賦值
示例:
#include
intmain
(int argc,
char
**argv)
// 輸出
>>
1>>
2
字元指標資料,也就是乙個陣列,裡邊的成員都是char *的指標,即:char *str = ;
二維字元陣列,乙個二維陣列,裡邊成員都是char型別的字元,即:char str[n] = ;
#include
intmain
(int argc,
char
**agrv)
;int i =0;
for(i=
0; i<
3; i++
)printf
("\n");
char hobbies[
10]=;
for(i =
0; i<
3; i++
)printf
("\n");
return0;
}// 輸出
>>tom alice bob
>>swimming sleeping reading
在使用上,二者是沒差的,但從記憶體上分析就存在區別。
字元指標陣列中的成員都是乙個char *的指標,也就是說,它們都是位址,真正的字串存放在常量區;二維字元陣列裡邊存放的都是乙個個char型別的字元。建議使用前者,因為字元指標陣列儲存字串要比二維字元陣列開銷小。
我記得有乙個送命遊戲叫做:南韓女星連連看。其實對我重度臉盲患者,豈止南韓女星,即便是現在的許多大陸女星,我也著實難分辨(其實現在的新興男星我也基本分不清了)。好在能不能區分出明星還是其次,重要的是區分以下的表示式。如果能夠輕易識別,指標也算入門了。
初談指標常量和常量指標
在學習c 中,對於指標方面的知識學習方面還是有一定難度的,相關概念也很晦澀難以理解,本人整理了相關的知識點已經本人的理解,希望可以得到大家的更正和幫助到你們的學習。很多老師為了同學們能很快的理解和應用指標,往往會告訴大家 指標即位址!其實我可以告訴你這是乙個不嚴謹的說法,正確來說 指標是乙個變數!變...
初談CSRF攻擊
我和大家分享一下我在開發時候遇到的一些問題,以及我的解決方案。跨站請求偽造 cross siterequest forger 簡稱csrf,有時候縮寫xsrf表示,攻擊要比簡單的跨站指令碼 xss 攻擊更危險。我主要講解它的危害以及如何防禦,並不會說明如何去實現。1.威脅概述 假設乙個 允許使用者登...
初談Java集合
1.集合是什麼?簡單來說,集合 陣列 對陣列的演算法,一般在實際操作過程中,批量管理陣列就是使用集合或者陣列。此外要注意的是 集合中儲存的是引用型別,並且集合只儲存每個元素物件的引用,而並非將元素物件本身存入集合中!因此導致,如果在集合之外修改集合中的元素,那麼集合也會受影響。2.集合框架 總的來說...