const int *p說明不能修改_C語言入門 第二十五章 const關鍵字的使用
技術標籤:const int *p說明不能修改
我們之前已經瞭解了常量的概念
- 在程式當中使用的資料都可以看作是資料常量
- 在預處理指令當中,可以定義巨集常量
常量表示在程式運行當中不能被修改的資料,今天我們來研究一下另外的一種定義常量的方式使用 const 關鍵字來宣告一個不能被修改值的變數
我們之前已經瞭解變數的宣告
#include<stdio.h>
int main(){
int a = 10;
a = 20;
printf("%d",a);
}
a是一個變數,我們可以在程式當中修改這個變數的值
假如我們希望在程式執行過程當中 a 的值不被修改,那麼就需要在宣告 a 的時候加上 const 限定符
#include<stdio.h>
int main(){
const int a = 10;
a = 20;
printf("%d",a);
}
這個時候再去修改 a 的值程式就會報錯
這裡提示 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 可以指向任意的地址
但是當我們試圖修改指標指向地址的值的時候,就會出錯
#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;//不允許的操作
}
這說明 const 限定的不是 p 而是 *p, 保證的是指標指向的值不能修改,而不是指標本身
如果 const 限定的是指標本身,就需要這樣寫
#include<stdio.h>
int main(){
int a=10;
int b=20;
int * const p=&a;
p=&b;//不允許的操作
}
把 const 緊挨著指標,表示指標本身只能指向一個固定的地址,如果指向其他的地址就會出錯
如果即需要限定地址的值,同時還要限定指向固定地址,那就在兩個位置同時加上 const
const int * const p;
const 也可以放到陣列的聲明當中,表示限定結構體和陣列當中的所有成員都是不可修改的
#include<stdio.h>
int main(){
const int a[3]={1,2,3};
a[0]=10;//不允許的操作
}
這裡表示陣列 a 當中所有成員都不能被修改
我們可以使用 const 去限定結構體的某個成員不能被修改
#include<stdio.h>
int main(){
struct S{
int a;
const int b;
};
struct S s={10,20};
s.b=20;//不允許的操作
}
還可以用const限定結構體變數,表示結構體變數的成員不能被修改
#include<stdio.h>
int main(){
struct S{
int a;
int b;
};
const struct S s={10,20};
s.a=10;//不允許的操作
s.b=20;
}
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);
}