写在前面
我们该如何称呼 & 与 *
& 取地址运算符
* 解引用符
指针常量 && 常量指针
关于指针常量
(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**。即选项②。