Summary
1)指標的本質是變數
,特殊在於儲存的內容是一段記憶體地址
。
2)在指標宣告時
,*號
表示所宣告的變數為指標
;在指標使用時
,*號
表示取指標所指向的記憶體空間中的值
3)指標作為函式引數:
- 指標是變數,因此可以宣告
指標引數
- 當一個函式體內部需要
改變實參的值
- 則需要使用指標引數;函式呼叫時
實參值將複製到形參
- 指標適用於
複雜資料型別作為引數
的函式中
4)口訣:左數右指
-- 當const
出現在*號左側
時,指向的資料為常量
;當const
出現在*號右側
時,指標為常量
。
const int* p; // 指標p可變,指向的資料*p不可變
int const* p; // 指標p可變,指向的資料*p不可變
int* const p; // 指標p不可變,指向的資料*p可變
const int* const p; // 指標p不可變,指向的資料*p也不可變
指標的本質分析
問題:程式中的變數
只是一段儲存空間的別名
,那麼是不是必須通過這個別名才能使用這段儲存空間?
1、指標的宣告和使用
下面的程式輸出什麼?為什麼
int i = 5;
int* p = &i;
printf("%d, %p\n", i, p); // 5, 0XBFDB216C
*p = 10;
printf("%d, %p\n", i, p); // 10, 0XBFDB216C
- 在指標
宣告時
,*號
表示所宣告的變數為指標
- 在指標
使用時
,*號
表示取指標所指向的記憶體空間中的值
2、傳值呼叫和傳址呼叫
- 指標是變數,因此可以宣告
指標引數
- 當一個函式體內部需要
改變實參的值
,則需要使用指標引數 - 函式呼叫時
實參值將複製到形參
指標適用於
複雜資料型別作為引數
的函式中// 指標作為引數分析 void swap1(int a, int b) { int t = a; a = b; b = a; } void swap2(int* pa, int* pb) { int t = *pa; *pa = *pb; *pb = t; } int main() { int a = 1, b = 2; swap1(a, b); // 將實參a和b的值,賦值給swap1引數a、b,函式內部實際修改的是函式的形參a和b,不會影響實參 printf("%d, %d\n", a, b); // 1, 2 swap2(&a, &b); // 將實參a和b的地址,賦值給引數指標pa和pb,函式內部使用*號開啟了這兩個地址,並修改了裡面的值,所以外面的實參也會變 printf("%d, %d\n", a, b); // 2, 1 return 0; }
3、const和指標
口訣:左數右指
-- 當const
出現在*號左側
時,指向的資料為常量
;當const
出現在*號右側
時,指標為常量
。
const int* p; // 指標p可變,指向的資料*p不可變
int const* p; // 指標p可變,指向的資料*p不可變
int* const p; // 指標p不可變,指向的資料*p可變
const int* const p; // 指標p不可變,指向的資料*p也不可變
本文總結自“狄泰軟體學院”唐佐林老師《C語言進階課程》。
如有錯漏之處,懇請指正。