1. 程式人生 > >【 C 】const 進一步解讀(由switch引出)

【 C 】const 進一步解讀(由switch引出)

之前有過一篇博文:const 學習筆記,可是讀《C專家程式設計》時候,遇到const還是會感到有點陌生,疑惑。可見,有必要進一步強調一些內容。

首先給出一個案例來引出本文:

const int two = 2;

switch( i ){
    case 1: printf("case 1\n");
    case two: printf("case 2\n");
    case 3: printf("case 3\n");
    default: ;
}

出現這段語句的程式能不能編譯通過呢?

我們測試一下:

#include <stdio.h>

int main()
{
    int i;
    const int two = 2;
    printf("Enter the number of i: ");
    scanf("%d", &i);
    switch( i )
    {
    case 1:
        printf("case 1\n"); break;
    case two:
        printf("case 2\n"); break;
    case 3:
        printf("case 3\n"); break;
    default:
        ;
    }

    return 0;

}

編譯,執行,提示如下錯誤:

case label does not reduce to an integer constant|

如果把語句:    const int two = 2; 改成:#define two 2的話,就沒有錯誤,這就說明了const 關鍵字並不真正表示常量。

不要以為在變數定義的前面加上const就會把變數變成常量,上例也說明了這個問題,並不能成功。

const的用法是:

在一個符號前加上const限定符只是表示這個符號不能再被賦值,也就是改變當前值,也就是它的值對於這個符號來說是隻讀的。

const最有用之處就是用它來限定函式的形參,這樣函式將不會修改實參指標所指向的資料。

const可以用在資料上,如:

const int limit = 10;

但當你把const 和指標操作符(間接操作符*)一起使用時,就有點難度且更有意思了。

這裡給出一個例子:

const int *limitp = &limit;

int i = 27;

limitp = &i;

分析:第一條語句的意思是limitp這個指標指向的值被限定為const,不能改變了,只能訪問,但是指標本身是可以改變的,這樣執行第2、3條語句,該指標就指向了不同的地址,對它進行間接訪問操作就可以得到一個不同的值了。

const 和 * 的組合通常只用於在陣列形式的引數中模擬傳值呼叫。它聲稱“我給你一個指向它的指標,但你不能修改它。”