細說C++(二十三):再談指針

寫在前面

我們該如何稱呼 & 與 *

& 取地址運算符


*  解引用符 

指針常量 && 常量指針

關於指針常量

(1)數組名在C語言中強調爲指針常量

(2)NULL是預處理器宏NULL被定義爲實現定義的空指針常量

(3)C語言規定函數名就是函數的入口地址

常引用 && 引用常量

多維指針

規律: 在於將一個A*** … *** 一級以上覆合指針類型賦予指針p,如果不使用原型聲明,那麼p必須保證是A … const * p; 也就是說p必須指向一個常量,否則就會產生中間指針遭到篡改的風險。

令人疑惑的C指針用法

C++規定不能將A** 轉換爲const A** ,但C語言可以,這一點易發生錯誤,C++中將之修正

我們來看一下下面的這些代碼:

#include <cstdio> 
#include <iostream>

using namespace std;

int main() 
{ 
    const int x = 1; 
    int* p; 
    int const** q = &p;  //① q爲一個指向const int*的指針,現在將其指向non-const int*  p 
    *q = &x;             // ②現在將q指向的指針賦爲常量x的地址(*q即爲指針p的地址,這時p指向x)
    //**q=2;             //③報錯
    *p = 2;               //④因爲p是non-const int *,所以可以對其賦值,這時將常量x的值改爲了2,明顯不符合常識
    printf("%d",x);
}

這裏的關鍵在於引入了中間指針p,雖然q本身被const 限制,使得q是const ,從而q不能被修改(見代碼④),但是(q)如果可以是non const的話(如我們熟悉的const int可以被賦值爲int ),p=*q是指向non-const的,可以被修改,顯然不合理。

而選項3正確的原因在於參數 const A* const*q,說明p指向一個const 指針(*q),這個const 指針再指向const對象。 const 指針本身不能被修改,所以上面代碼②會 報錯。即q指向A**也無影響。

向編譯器報錯學習
#include <iostream>

using namespace std;

class A{
	
};

void f1(const A** pointer)
{
	
}

void f2(const A* const *pointer)
{
	
}

void f3(const A* & pointer)
{
	
}

int main()
{
	const A* a = new A();
	A *b = new A();
	A** p = &b;
	
	f1(a);
	f2(p);
	f3(p);
	
	return 0;
}

1.const A *等價 A const *。

2.允許用A *賦值A const *。

3.允許用A**賦值A const*const *。即選項③

4.不允許用A**賦值A const**。即選項②。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章