寫在前面
我們該如何稱呼 & 與 *
& 取地址運算符
* 解引用符
指針常量 && 常量指針
關於指針常量
(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**。即選項②。