C語言 const 修飾函數參數 - C語言零基礎入門教程


目錄

零基礎 C/C++ 學習路線推薦 : C/C++ 學習目錄 >> C 語言基礎入門

一.const 簡介

const 是 constant 的縮寫,“恆定不變”的意思。被 const 修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性。所以很多 C++ 程序設計書籍建議:“Use const whenever you need”。

1.const 修飾變量

/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言 const 修飾函數參數
//@Time:2021/07/04 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/

#include <stdio.h>

int main() {
    const int a = 20 ;
    printf("a = %d\n",a);
    a = 200 ;
    printf("a = %d\n",a);
    return 0;
}

/*
 輸出:

 Compilation Failed
 error: assignment of read-only variable 'a'
     6 |     a = 200 ;
       |     ~~^~~~~
 */

用 const 定義的變量的值是不允許改變的,即不允許給它重新賦值,即使是賦相同的值也不可以。並且 const 修飾的變量在定義的時候就給它賦初值,否則報錯:

error: uninitialized 'const ' [-fpermissive]

詳細解釋可以直接跳轉:const 修飾變量

2.const 修飾指針

//以下兩者等價,表示 *p 不可變。*p 表示的是指針變量 p 所指向的內存單元里面的內容,此時這個內容不可變;
const int *p
int const *p


//此時 const 修飾的是 p,所以 p 中存放的內存單元的地址不可變,而內存單元中的內容可變。即 p 的指向不可變,p 所指向的內存單元的內容可變;
int * const p


//*p 和 p 都被修飾了,那么 p 中存放的內存單元的地址和內存單元中的內容都不可變;
const int * const p

詳細解釋可以直接跳轉:const 修飾指針

3.const 修飾在函數名前面

當 const 在函數名前面的時候修飾的是函數返回值;在函數名后面表示是 C++ 常成員函數,該函數不能修改對象內的任何成員,只能發生讀操作,不能發生寫操作。

const char * GetString(void);
const int    GetInt(void);
const float  GetFloat(void);
const double GetDdouble(void);

如果給以“指針傳遞”方式的函數返回值加 const 修飾,那么函數返回值(即指針)的內容不能被修改,該返回值只能被賦給加 const 修飾的同類型指針;

const char * GetString(void);

//如下語句將出現編譯錯誤:
//char *str = GetString();

//正確的用法是
const char  *str = GetString();

如果函數返回值采用“值傳遞方式”,由於函數會把返回值復制到外部臨時的存儲單元中,加 const 修飾沒有任何價值。

int GetInt(void);

const int GetInt(void);

以上兩個函數都是都是獨立存在的,並非同一個函數;

4.const 修飾在函數名后面

當 const 在函數名前面的時候修飾的是函數返回值;在函數名后面表示是 C++ 常成員函數,該函數不能修改對象內的任何成員,只能發生讀操作,不能發生寫操作。

/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言 const 修飾函數參數
//@Time:2021/07/04 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/


class People
{
 public:
    int talk(void);
    int eat(void) const; // const 成員函數
 private:
    int m_age;

};
int People::eat(void) const
{
    ++m_age; // 編譯錯誤,企圖修改數據成員m_num
    talk();  // 編譯錯誤,企圖調用非const函數
    return    m_age;
}
  • const 對象只能訪問 const 成員函數,而非 const 對象可以訪問任意的成員函數,包括 const 成員函數;
  • const 對象的成員是不可修改的,然而 const 對象通過指針維護的對象卻是可以修改的;
  • const 成員函數不可以修改對象的數據,不管對象是否具有 const 性質.它在編譯時,以是否修改成員數據為依據,進行檢查;
  • 然而加上 mutable 修飾符的數據成員,對於任何情況下通過任何手段都可修改,自然此時的 const 成員函數是可以修改它的;

二.const 修飾函數參數

關於函數參數值傳遞和址傳遞:

  • 值傳遞:實參是傳遞的值,並非地址,形參的值發生改變,實參不受影響;
  • 址傳遞:實參是傳遞的地址,並非值,形參的值發生改變,實參會跟着一起改變(因為實參和形參都是指向同一塊內存地址);

1.值傳遞

值傳遞一般作為輸入參數,實參是傳遞的值,並非地址,形參的值發生改變,實參不受影響;

/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言 const 修飾函數參數
//@Time:2021/07/04 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/

#include <stdio.h>
void func(int x, int y)
{
    x = 100;
    y = 200;
    printf("func:x = %d, y = %d\n", x, y);
}
int main(void)
{
    int a=10;
    int b=20;
     /*變量a、b為func函數的實際參數*/
    func(a, b);
    printf("main:a = %d, b = %d\n", a, b);
    return 0;
}
/*
輸出:
func:x = 100, y = 200
main:x = 10, y = 20
*/

2.址傳遞

址傳遞:使用指針變量或者內存地址作為函數參數,在調用結束后,實參跟隨形參一起變化可以作為輸入參數也可以作為輸出參數)。舉個例子:

/**************************************************************/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言 const 修飾函數參數
//@Time:2021/07/04 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/

#include <stdio.h>
void func(int *x, int *y)
{
    *x = 100;
    *y = 200;
    printf("func:x = %d, y = %d\n", x, y);
}
int main(void)
{
    int a=10;
    int b=20;
     /*分別對變量a、b取地址,並作為func函數的實際參數*/
    func(&a, &b);
    printf("main:a = %d, b = %d\n", a, b);
    return 0;
}
/*
輸出:
func:x = 100, y = 200
main:x = 100, y = 200
*/

3.const 修飾函數參數

如果函數參數采用“指針傳遞”,那么加 const 修飾可以防止意外地改動該指針,起到保護作用。

void StringCopy (char*strDestination, const char *strSource);

其中 strSource 是輸入參數,strDestination 是輸出參數。給 strSource 加上 const 修飾后,如果函數體內的語句試圖改動 strSource 的內容,編譯器將指出錯誤。

如果輸入參數采用“值傳遞”,由於函數將自動產生臨時變量用於復制該參數,該輸入參數本來就無需保護,所以不要加 const 修飾。

例如不要將函數 void Func1(int x) 寫成 void Func1(const int x)。

如果參數作為輸出參數,不論它是什么數據類型,也不論它采用“指針傳遞”還是“引用傳遞”,都不能加 const 修飾,否則該參數將失去輸出功能(因為有 const 修飾之后,不能改變他的值)。

如果參數作為輸入參數,可以防止數據被改變,起到保護作用,增加程序的健壯性;

三.猜你喜歡

  1. C 語言 數組下標越界和內存溢出區別
  2. C 語言 指針聲明和定義
  3. C 語言 指針 p++ / p–
  4. C 語言 p++/§++/_(p++)/_p++
  5. C 語言 使用指針遍歷數組
  6. C 語言 指針和數組區別
  7. C 語言 指針數組和數組指針區別
  8. C 語言 空指針 NULL
  9. C 語言 void 指針
  10. C 語言 野指針
  11. C 語言 函數值傳遞和址傳遞
  12. C 語言 函數缺省參數
  13. C 語言 函數不定長參數
  14. C 語言 函數指針
  15. C 語言 指針函數
  16. C 語言 回調函數 callback
  17. C 語言 typedef
  18. C 語言 define 定義常量
  19. C 語言 define 防止頭文件重復包含
  20. C 語言 #pragma once
  21. C 語言 #include <> 與 #include “” 區別
  22. C 語言 const 修飾變量
  23. C 語言 const 修飾指針
  24. C語言 const 修飾函數
  25. C 語言 const 修飾函數參數

未經允許不得轉載:猿說編程 » C 語言 const 修飾函數參數

本文由博客 - 猿說編程 猿說編程 發布!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM