1. 程式人生 > 其它 >const int *p說明不能修改_C語言入門 第二十五章 const關鍵字的使用

const int *p說明不能修改_C語言入門 第二十五章 const關鍵字的使用

技術標籤:const int *p說明不能修改

我們之前已經瞭解了常量的概念

  • 在程式當中使用的資料都可以看作是資料常量
  • 在預處理指令當中,可以定義巨集常量

常量表示在程式運行當中不能被修改的資料,今天我們來研究一下另外的一種定義常量的方式使用 const 關鍵字來宣告一個不能被修改值的變數

我們之前已經瞭解變數的宣告

#include<stdio.h>
int main(){
    int a = 10;
    a = 20;
    printf("%d",a);
}

a是一個變數,我們可以在程式當中修改這個變數的值

bf76be5f720771f362d2ff7c00000a2b.png

假如我們希望在程式執行過程當中 a 的值不被修改,那麼就需要在宣告 a 的時候加上 const 限定符

#include<stdio.h>
int main(){
    const int a = 10;
    a = 20;
    printf("%d",a);
}

這個時候再去修改 a 的值程式就會報錯

3b2cb613204418245c914bb1791b7432.png

這裡提示 a 是一個只讀的變數,不能修改

const 關鍵字在限定變數的時候可以載入型別的前面,也可以加在型別的後面

const 型別 變數;
型別 const 變數;

這裡兩種方式都可以,達到的效果是一樣的

需要注意的是在使用 const 的時候一定要對宣告的變數進行初始化,因為const宣告之後就沒有辦法再重新賦值了

#include<stdio.h>
int main(){
    const int a;
    a = 20;
    printf("%d",a);
}

這樣寫程式會報錯

const 的本意並不是建立常量,而是限定宣告變數的值不能被修改(read-only),所以還會出現一些比較複雜的情況

比如當 const 用來宣告指標變數的時候,我們會出現以下的幾種情況

const 型別 *指標
型別 const * 指標
型別 * const 指標

把 const 放在宣告語句的不同位置,得到的指標的操作限定也不一樣

  • 前兩種寫法的效果相同表示的是指標指向地址的值不能修改,而指標本身不被限定
  • 後一種寫法表示的是指標被限定為指向固定地址,但是地址的值不被限定

簡單的看幾個例子

#include<stdio.h>
int main(){
    int a=10;
    int b=20;
    const int * p;

    p=&a;
    printf("%pn",p);

    p=&b;
    printf("%p",p);
}

這裡使用 const 聲明瞭一個指標 p ,但是 p 可以指向任意的地址

e2142836d96a51a1e3b8bcb7ed57af76.png

但是當我們試圖修改指標指向地址的值的時候,就會出錯

#include<stdio.h>
int main(){
    int a=10;
    int b=20;
    const int * p;

    p=&a;
    printf("%pn",p);

    p=&b;
    printf("%p",p);

    *p=30;//不允許的操作
}

588e3e9466681ab8e3e91f8f801b12dd.png

這說明 const 限定的不是 p 而是 *p, 保證的是指標指向的值不能修改,而不是指標本身

如果 const 限定的是指標本身,就需要這樣寫

#include<stdio.h>
int main(){
    int a=10;
    int b=20;
    int * const p=&a;

    p=&b;//不允許的操作
}

把 const 緊挨著指標,表示指標本身只能指向一個固定的地址,如果指向其他的地址就會出錯

fde2fe93902a33eed51e369982b9f03e.png

如果即需要限定地址的值,同時還要限定指向固定地址,那就在兩個位置同時加上 const

const int * const p;

const 也可以放到陣列的聲明當中,表示限定結構體和陣列當中的所有成員都是不可修改的

#include<stdio.h>
int main(){
    const int a[3]={1,2,3};
    a[0]=10;//不允許的操作
}

這裡表示陣列 a 當中所有成員都不能被修改

ed98fa268ce475275ad3e0697ebde891.png

我們可以使用 const 去限定結構體的某個成員不能被修改

#include<stdio.h>
int main(){
    struct S{
        int a;
        const int b;
    };

    struct S s={10,20};
    s.b=20;//不允許的操作
}

e502b6c8ffb170209c89ba2a8aca87db.png

還可以用const限定結構體變數,表示結構體變數的成員不能被修改

#include<stdio.h>
int main(){
    struct S{
        int a;
        int b;
    };

    const struct S s={10,20};
    s.a=10;//不允許的操作
    s.b=20;
}

623254b3fa519af5130147675d536908.png

const 也可以作為函式的引數和返回值,最常見的情況就是用來限定傳入指標的地址的值不能被修改

#include<stdio.h>
void changeNum(int * p){
    *p+=1;
}

int main(){
    int a=11;
    changeNum(&a);
    printf("%d",a);
}

這裡使用一個函式修改變數的值,假如我們不允許這個操作,就可以把函式的形參設定為const,表示指標指向地址的值不能被修改

#include<stdio.h>
void changeNum(const int * p){
    *p+=1;//不允許的操作
}

int main(){
    int a=11;
    changeNum(&a);
    printf("%d",a);
}

3e9f4bf48c0fe6c6267b54582d13d95c.png