1. 通過 &變數 可以擷取變數地址:
#include <stdio.h>int main(void){ int num = 10; printf("變數值: %d\n", num); printf("變數址: %d\n", &num); getchar(); return 0;}
2. 表示變數地址的變數就是指標:
#include <stdio.h>int main(void){ int num = 10; int *p = # printf("%d, %p\n", num, p); getchar(); return 0;}
3. *指標 就如同變數本身是一樣的:
#include <stdio.h>int main(void){ int num = 10; int *p = # printf("%d, %p, %d\n", num, p, *p); *p = 11; printf("%d, %p, %d\n", num, p, *p); (*p)++; printf("%d, %p, %d\n", num, p, *p); num = 99; printf("%d, %p, %d\n", num, p, *p); getchar(); return 0;}
4. 聲明指標時要注意初始化, 沒有初始化的指標是危險的:
#include <stdio.h>int main(void){ int n1 = 11; int n2 = 22; int *p = NULL; /* 初始化為空白 */ p = &n1; printf("%d, %p, %d\n", n1, p, *p); p = &n2; printf("%d, %p, %d\n", n2, p, *p); getchar(); return 0;}
5. 為什麼沒有初始化的指標是危險的:
#include <stdio.h>int main(void){ int *p; // 上面的指標 p 沒有初始化話, 但它也有個垃圾地址 printf("%p\n", p); // 此時如果給它賦值, 誰知道會覆蓋了什麼? //*p = 100; /* 不要執行這個 */ getchar(); return 0;}
6. 指向常量的指標: 不能通過指標修改它指向的值, 但該值可以通過其變數修改
#include <stdio.h>int main(void){ int n1 = 111; int n2 = 222; const int *p = &n1; /* 注意 const 的使用 */ printf("%d, %p, %d\n", n1, p, *p); n1 = 333; //*p = 333; /* 不可以這樣, 因為現在的指標是常量 */ printf("%d, %p, %d\n", n1, p, *p); p = &n2; /* 可以改變指標的指向 */ printf("%d, %p, %d\n", n2, p, *p); getchar(); return 0;}
7. 常量指標: 鎖定指標的指向
#include <stdio.h>int main(void){ int n1 = 111; int n2 = 222; int *const p = &n1; /* 注意 const 的使用 */ printf("%d, %p, %d\n", n1, p, *p); n1 = 333; //*p = 333; /* 不可以這樣, 因為現在的指標是常量 */ printf("%d, %p, %d\n", n1, p, *p);// p = &n2; /* 現在不可以改變指標的指向了 */// printf("%d, %p, %d\n", n2, p, *p); getchar(); return 0;}
8. 指標是有類型的:
#include <stdio.h>int main(void){ long n = 100L; float f = 1.5f; double d = 3.14159265; long *p1 = &n; float *p2 = &f; double *p3 = &d; printf("%ld\n", *p1); printf("%g\n", *p2); printf("%.8f\n",*p3); getchar(); return 0;}
9. 令人迷惑的指標定義:
到底應該怎樣寫:
int *p;
int * p;
int* p;
因為 C 語言忽略空白, 這些都是對的, 但下面的例子會說明哪個更好:
#include <stdio.h>int main(void){ int n1, n2, *p; /* 定義了兩個整數(n1、n2), 和一個整數指標(p) */ n1 = 111; n2 = 222; p = &n1; printf("%d, %p\n", *p, p); p = &n2; printf("%d, %p\n", *p, p); getchar(); return 0;}