【C進階】26、指標的本質分析

bryson發表於2021-12-27

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
  • 在指標宣告時*號表示所宣告的變數為指標
  • 在指標使用時*號表示取指標所指向的記憶體空間中的值
    image.png

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語言進階課程》。
如有錯漏之處,懇請指正。

相關文章