c 指向常量的指標和指向變數的指標常量

2021-08-14 23:15:41 字數 1367 閱讀 1170

1.const int *p

就是所謂的「指向常量的指標」。這裡注意,所謂「指向常量」只是這個指標的「一廂情願」,只是一種效果上的等價。事實上,const int *p=&a;a既可以是常量(const int a=10;)又可以是變數(int a=10;),但p一廂情願地認為它所指的就是乙個常量,所以它不允許通過自己來修改所指,這就造成一種效果上的等價——從p的角度看,它所指的「的確」是常量。所以,對「指向常量的指標」的最佳理解應為:我們不能通過該指標修改它所指向的東西(常量或者變數)。

注意,const int *p=&a;只是說不能通過p來修改a,如果a本身不是const的,通過其它方式修改a自然是可以的(例如直接++a)。

另外一點,由於p本身只是乙個普通的指標,所以允許在宣告時不初始化。但需要注意的是,我們只是說可以,但並不提倡這樣做。在任何時候都不應該讓指標無所指,如果在宣告乙個指標時還不知道讓它指向誰,就先將其初始化為nullptr或null(nullptr是c++11新特性,用它比用null更安全些,這裡不詳細介紹)。

2.int* const p

就是所謂的「本身是常量的指標」。關於「p本身不能修改但可以通過p修改其所指」這一點,我們在講判斷方法時已經說過,這裡主要再說一下p的初始化。

由於p本身是const的,所以在編譯的時候必須知道p的值(即p所指向的東西的位址),所以在宣告p的同時必須初始化p。但要注意,對於 int* const p=&a,我們只要求a的位址是確定的,但a的值可以不確定。比如下面的**是可行的

#include

using

namespace

std;

int getdata(int num)

int main()

由於宣告了int b,所以b的位址在編譯時是確定的,但很顯然,b的值只要在程式執行時才能確定。

另外注意,用nullptr或null初始化int* const p沒有問題,因為nullptr和null都代表有效位址。

3.const int* const p

就是所謂的「所指和本身都是常量的指標」。它的語法特性就是前兩者的結合,這裡不再贅述。

4.引用和指標

int a = 10;

int &ra = a;

ra = 11;

在上面的**中,編譯器將int &ra=a轉化為int* const ra=&a,而將ra=11轉化為*ra=11,將ra自動轉化為*ra的過程,就是上面定義中所說的「自動解引用」。

那麼,什麼是const引用(即我們說的常量引用,但我希望大家稱其為const引用而不是常量引用)呢?很顯然,const int &ra=a就相當於const int* const ra=&a了。相信通過前面的講解,這裡不用在下多說了。

C 指向常量的指標 常指標和指向常量的指標

c 的乙個很明顯的特性就是指標。指標正是c 強大的原因,同時也會他比較難的乙個原因。這裡簡單介紹下c 中指向常量的指標 常指標和指向常量的常指標的概念。一 指向常量的指標 定義方法 const int ptr intconst ptr 那麼什麼是指向常量的指標呢?簡單來說,就是指標指向的內容是常量,...

C 常量指標 指向常量的指標

常量指標 我們可以將指標宣告為常量指標,這樣指標是不可以改變的,但是指標指向的內容是可以改變。指標中儲存的位址是不可變的 include using namespace std class a void set int x private int i int main 指向常量的指標 我們定義乙個指...

常量指標和指向常量的指標

首先指出乙個錯誤,壓根就不應該有指標常量這個說法。經常聽到有關常量指標和指標常量的討論,也經常見到有關兩者區別的文章,然而,有些文章卻誤導了讀者,他們的結論根本就是錯的。例如關於指標常量和常量指標的討論,結果完全顛倒了 而其他一些文章呢,充其量只是火上加油,讓本來就很複雜的事情變得更加難於理解,例如...