指標 01010 10101 01010 10101 01010 10101
指標Pointer 指標和int,float,char一樣,為C語言的一種資料型別 大小為4 bytes(硬體32位元) 記憶體的地址(可視為unsigned int) 相關的運算符號有*(透過pointer取記憶體內容),&(取變數地址),=,+,-
指標的用法 &:取得變數的位址 *:間接參考,用指標取得記憶體的內容
指標的用法 int a=1, b=2, c=0; int *p; p = &a; 宣告p是指向int的指標 p is a pointer to int p = &a; &a是取a的地址(沒有&的話就變成取a的內容) =讓&a複製到p,也就是說現在p的內容為變數a的地址 1 2 xxxx0001 xxxx0003 xxxx0005 &a xxxx0001 xxxx0007 b c a p
指標的用法 b = *p; *p = 0; p = &c; b的值被設定為指標p所指到記憶體的值 沒有*的話就變成取p的內容,而不是透過p去取a的內容 *p = 0; 透過p將a的值設定為0,即a=0 p = &c; 指標p現在指向c 1 1 2 xxxx0005 xxxx0001 xxxx0001 xxxx0003 xxxx0005 xxxx0007 a b c p
指標的用法 *p = *p + 10; b = *p + 1; ++*p; 透過p把c的值增加10 透過p取c的值,加1之後把結果存入b中 1 11 11 10 xxxx0005 xxxx0003 xxxx0005 xxxx0007 xxxx0001 a b c p
進階
指標使用錯誤 int *x pointer x 指到的記憶體內容是否合法,C語言不管 初學者常宣告pointer,但pointer指到的空間沒有分配 #include <stdio.h> int main() { int x; int *p; p = 0; // 這讓p指到不合法的地方去了 *p = 0; // 透過p去設定不合法的記憶體, 會產生嚴重錯誤 x = *p; // 這也是錯的 } ???????? ? 00000000 … 00000000 00000001 xxxx0001 xxxx0003 x p
指標的+、-、運算符號 pointer p + integer n,表示指標p往下指n個元素 pointer p - pointer q,表示q和p之間距離了幾個元素 pointer p - integer n,表示指標往上指n個元素 #include <stdio.h> int main() { int x[100]; int *p, *q; p = x; q = x + 10; *(p+10) = 100; // 相當於x[10] = 100 printf("offset between p and q is %d\", q - p); // 這會印出10 } yyyy0001 X[0] yyyy0003 X[1] yyyy0021 X[10] 100 X[20] yyyy041 yyyy0199 X[99] … … … … yyyy0001 yyyy021 xxxx0001 xxxx0003 p q
指標的+、-、運算符號 使用+-符號來移動指標,不要指到不確定的位址 p #include <stdio.h> main () { float z = 5.5; int x = 5; int y = 5; int *p; p = &x; p = p + 1; // 想把p指到哪裡去啊? printf("%d %d %f\n", x, y, z); *p = 20; } zzzzzz01 5.5 z xxxxxx01 5 X yyyyyy01 5 y ???????? xxxxxx01 pppp0001 p
指標也可以指到另一個指標 #include <stdio.h> main () { int y = 2; int x = 5; int *p; int **q; p = &x; //把p 指到 x q = &p; // 把 q 指到 p *q = &y; // 透過q把p的內容改為指到y printf("%d\n", *p); // 會印出2 printf("%d\n", **q); // 會印出2 } yyyy0001 2 y yyyy0003 5 x yyyy0001 yyyy0003 xxxx0001 p xxxx0003 q xxxx0001 printf(“%d\n”, *q);會印出? yyyy0001
參數傳遞Call by Value C 函數呼叫參數傳遞使用Call by Value,被呼叫的函數無法直接存取呼叫函數內的變數。若要類似Call by Reference,要透過傳遞指標 void fun(int x, int y) { x = 5 y = 5; } void main() { int x = 0; int y = 0; fun(x, y); printf("%d %d\n", x, y); yyyy0001 5 x yyyy0003 5 y xxxx0001 x y xxxx0003
傳遞指標: fun可以存取main裡面的x,y void fun(int * x, int * y) { *x = 5; *y = 5; } void main() { int x = 0; int y = 0; fun(&x, &y); printf("%d %d\n", x, y); fun的x,y和main的x,y是不同的變數型態,一指標,一整數 fun裡的pointer x,y其內容是main裡x,y的地址 透過pointer x,y可以存取main的int x,y yyyy0001 xxxx0001 x yyyy0003 xxxx0003 y xxxx0001 x 5 5 y xxxx0003