const修飾符、const與指標一起使用(C++學習筆記 6)
阿新 • • 發佈:2018-11-05
一、 在C++中使用const修飾符來定義常量。(const來自單詞constant,是常量的意思)
用法:const 型別 常量名 = 表示式;
例如:const int LIMIT = 100;
這個常量LIMIT是有型別的,佔用儲存單元,有地址,可以用指標指向它,但不能修改它。
二、對應C中的#define,在C中,習慣使用#define來定義常量
例如:#define LIMIT 100
這種方法只是在預編譯時進行字元置換,把程式中出現的識別符號LIMIT全部置換為100,在預編譯之後,程式中不再有LIMIT這個識別符號。LIMIT不是變數,沒有型別,不佔用儲存單元,而且容易出錯。
三、const的作用與#define相似,但它消除了#define的不安全性。
例子1: 使用#define的不安全性
#include<stdio.h>
void main(){
int a=1;
#define T1 a+a
#define T2 T1-T1
printf("T2 is:%d",T2);
}
程式按理說應該打印出 : T2 is:0
但是程式的實際輸出是:
原因是:
程式把 printf(“T2 is:%d”,T2); 這個句子看做是 printf(“T2 is:%d”,a+a-a+a);
如果程式中用const取代了#define,將不會引起這個錯誤。如下面的例子:
例子2: 用const取代#define。
#include<iostream>
using namespace std;
int main(){
int a=1;
const int T1=a+a;
const int T2=T1-T1;
cout<<"T2 is :"<<T2<<endl;
return 0;
}
程式的執行結果:
四、const與指標一起使用
它們的組合情況較複雜,可歸納為3種:指向常量的指標、常指標、指向常量的常指標。
-
指向常量的指標(例:const int *pi = &i;)
“指向常量的指標” 是指一個指向常量的指標變數,我們不能通過該指標修改它所指向的東西。例如:
const int *pi = &i; //宣告指向常量的指標
這個語句的含義是:宣告一個名為pi的指標變數,它指向一個整型常量,初始化pi為指向i。
由於使用了const,不允許改變指標所指地址中的常量(但是可改變地址),例如:
#include<iostream>
using namespace std;
int main(){
int i=1;
const int *pi=&i;
cout<<*pi<<endl;//輸出1
i=2;
cout<<*pi<<endl;//輸出2
//*pi=3; //這樣修改會出錯
//cout<<*pi<<endl;
return 0;
}
-
常指標(例:int *const pi=&i)
“常指標” 是指把指標所指的地址,而不是它指向的物件宣告為常量,不可以改變指標所指的地址,例如:
int *const pi = &i; //常指標
這個語句的含義是:宣告一個名為name的指標變數,該指標是指向字元型資料的常指標,用"chen"的地址初始化該常指標。
建立一個常指標,就是建立一個不能移動的固定指標,即不能改變指標所指的地址,但是它所指地址中的資料可以改變,例如:
#include<iostream>
using namespace std;
int main(){
int i1=30;
int i2=40;
int *const pi=&i1;
//pi=&i2;
//這裡會出錯,不能再重新給pi賦值了,即不能再指向另一個地址了
cout<<*pi<<endl; //輸出30
i1=60;
cout<<*pi<<endl;//輸出60
*pi=90;
cout<<"i1的值為:"<<i1<<" "<<"pi中儲存的值為:"<<*pi;
return 0;
}
- 指向常量的常指標(例:int const *const pi = &i1;)
“指向常量的常指標” 既不可以通過該指標修改它所指向地址中的資料,也不可以改變該指標所指的地址。
#include<iostream>
using namespace std;
int main(){
int i1=30;
int i2=40;
int const *const p = &i1;
cout<<"*p的值為:"<<*p<<endl<<"i1的值為:"<<i1<<endl;
//*p=50; 不能改變該指標指向地址中的資料
//p=&i2; 不能改變該指標所指的地址
return 0;
}