1. 程式人生 > >const修飾符、const與指標一起使用(C++學習筆記 6)

const修飾符、const與指標一起使用(C++學習筆記 6)

一、 在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種:指向常量的指標、常指標、指向常量的常指標。

  1. 指向常量的指標(例: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;
}
  1. 常指標(例: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;
}
  1. 指向常量的常指標(例: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;
}