C語言-指標深度分析
阿新 • • 發佈:2018-12-16
1、變量回顧
程式中的變數只是—段儲存空間的別名,那麼是不
是必須通過這個別名才能使用這段儲存空間?
2、思考
下面的程式輸出什麼?為什麼?
1 int i = 5; 2 int* p = &i;3 4 printf("%d, %p\n", i, p); 5 6 *p = 10; 7 8 printf("%d, %p\n", i, p);
3、*號的意義
在指標宣告時,*號表示所宣告的變數為指標
在指標使用時,*號表示取指標所指向的記憶體空間中的值
*相當於一把鑰匙,通過這把鑰匙開啟記憶體,讀取記憶體中的值。
4、例項分析
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = 0; 6 int* pI; 7 char* pC; 8 float* pF; 9 10 pI = &i; 11 12 *pI = 10; 13 14 printf("%p, %p, %d\n", pI, &i, i); 15 printf("%d, %d, %p\n", sizeof(int*), sizeof(pI), &pI); 16 printf("%d, %d, %p\n", sizeof(char*), sizeof(pC), &pC); 17 printf("%d, %d, %p\n", sizeof(float*), sizeof(pF), &pF); 18 19 return 0; 20 }
5、傳值呼叫與傳址呼叫
指標是變數,因此可以宣告指標引數
當—個函式體內部需要改變實參的值,則需要使用指標引數 (★)
函式呼叫時實參值將複製到形參
指標適用於複雜資料型別作為引數的函式中
6、程式設計實驗
利用指標交換變數 26-2.c
1 #include <stdio.h> 2 3 int swap(int* a, int* b) 4 { 5 int c = *a; 6 7 *a = *b; 8 9 *b = c; 10 } 11 12 int main() 13 { 14 int aa = 1; 15 int bb = 2; 16 17 printf("aa = %d, bb = %d\n", aa, bb); 18 19 swap(&aa, &bb); 20 21 printf("aa = %d, bb = %d\n", aa, bb); 22 23 return 0; 24 }
7、常量與指標
常量指標( p可變,p指向的內容不可變 )
- const int* p;
- int const* p;
指標常量 (p不可變,p指向的內容可變 )
- int* const p;
*p與p均為常量
- const int* const p; //p和p指向的內容都不可變
8、例項分析
常量與指標 26-3.c
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = 0; 6 7 const int* p1 = &i; 8 int const* p2 = &i; 9 int* const p3 = &i; 10 const int* const p4 = &i; 11 12 *p1 = 1; // compile error 13 p1 = NULL; // ok 14 15 *p2 = 2; // compile error 16 p2 = NULL; // ok 17 18 *p3 = 3; // ok 19 p3 = NULL; // compile error 20 21 *p4 = 4; // compile error 22 p4 = NULL; // compile error 23 24 return 0; 25 }
9、小結
指標是C語言中一種特別的變數
指標所儲存的值是記憶體的地址
可以通過指標修改記憶體中的任意地址內容