细说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**。即选项②。

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