指標是記憶體物件的簡單位址,用指標,可以間接的訪問這些物件(知道記憶體單元的位址,當然就能夠訪問到記憶體單元了)。
簡單的把資料作為引數傳入函式,函式即使修改引數的內容也不會對呼叫者中的資料產生影響(看了之前的函式底層實現,應該很容易的知道這是為什麼),而使用指標,使得函式可以修改呼叫者傳遞進來的引數(傳遞的是位址,可以通過位址訪問到對應的記憶體物件,接著就可以對其做修改了)
陣列就是記憶體中一組用來儲存資料序列的連續空間(還記得彙編的偽操作指令stringz嗎?連續占用n+1記憶體用於存放n個字元,陣列的原理和這個類似),通過array[i]來訪問陣列array中第i+1個元素(陣列下標從0開始)
指標:宣告指標變數
type *ptr; //宣告乙個type型別的指標變數
指標變數的初始化和普通變數一致,如果作為區域性變數將不會自動初始化。
指標運算子:
位址運算子(&)、間接引用運算子(*)
位址運算子生成乙個它的運算元的記憶體位址,該運算元肯定是乙個記憶體物件。
間接引用符的作用是允許我們間接的訪問記憶體物件的值。
int v1; //宣告乙個int型變數v1
int *ptr; //宣告乙個int型指標變數ptr
v1 = 666;
ptr = &v1; //取v1的位址並賦值給p1
*ptr = *ptr + 1; //取ptr指向的位址的記憶體單元值(即v1)並+1 等價於v1=v1+1
++ptr;//修改ptr本身值就是修改位址,即修改指向的記憶體單元,ptr這下已經不指向v1了
指標傳遞乙個引用
我們可以把函式的引數定義為指標型別,這樣就可以通過傳遞指標來修改對應的值了。
//交換a b, 想想不用中間變數temp如果實現交換, 提示 a^b^b = a;
void swap(int* a, int* b)
int main()
空指標:
有時候,我們希望指標不指向任何東西,我們稱為空指標,c語言中的空指標是這樣的
int *ptr;
ptr = null;
c語言中null是乙個特別定義的預處理巨集,包含乙個「非空指標」不可能包含的值,特定系統null可以定義為數值0,因為位址0不存在任何有效的記憶體物件。
陣列:陣列用於存放一組連續的擁有相同型別的資料。
陣列宣告:
int a[10]; //乙個包含10個位址位用於存放int型資料的陣列
void func1(int size)
其中a[0]在低位位址,a[9]在高位位址。陣列的項數必須是確定值而不是引數形式
int a[10];
int *ptr;
ptr = a; //將ptr指向陣列的開始位址即a[0]所在位址
++ptr; //指向a[1]
int b = a[5]; //取a中第6個元素,注意下標從0開始
a引用的是陣列首元素的位址,且a不可修改。
陣列引數:
函式間傳遞陣列,天生採用的是"傳址"方式。(即傳入的引數為陣列的首元素位址)
void func1(int a)
void func()
; printf("before: %d,%d\n", a[0], a[1]);
func1(a);
printf("after: %d,%d\n", a[0], a[1]);
}
c語言字串:
c語言的字串本質是char陣列。
char str[10];
注意字串結尾處是乙個空字串,代表字串的結束,這個空字串表示為'\0',結束符本身也是乙個字元,會占用陣列的乙個位置,所以,上面宣告的字串實際只能存放9個字元。(注意,字元陣列的長度不代表字串長度,已結束符之前字元長度為準)
c語言的陣列不提供陣列越界保護(這意味著必須小心的運算元組,陣列越界可能導致嚴重的後果)
指標陣列和陣列指標
有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...
指標陣列和陣列指標
理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...
指標陣列和陣列指標
該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...