指针与 const --- 指针常量与常量指针

时间:2023-03-08 21:18:17

注:该文主要来源于 网易公开课之《C++ 程序设计入门(上)》课件。

在 C 语言标准中,const 修饰的变量称之为 只读变量,

在 C++ 语言标准中,const 修饰的变量称之为 常量,

例:

const int ARRAY_LEN = 100;

int array[ARRAY_LEN];    //该语句在C++ 编译器中是可行的,但是在C编译器中是会报错的

以上是 const 在 C 和 C++ 中的差别,下边主要介绍 const 与指针:

1. 指针的两个属性

a. 指针变量本身

b. 指针变量所指向的内容

2. 常量指针和指针常量

a. 常量指针(常指针):指针(p)所指向的内容不能通过指针的间接引用(*p)来改变

例:

const int i = 0;

const int* p1 = &i;    //指针 p1 的类型是 const int*

*p1 = 10;    //error

b. 指针常量:指针本身的内容是一个常量,不可以改变

例:

int a = 1;

int b = 2;

int* const p = &a;    //常量 p2 的类型是 int*

*p2 = 10;    //ok, a = 10

p = &b;    //error

注:数组名是数组首地址的别名,可以说 数组名就是一个指针常量,所以 :

int a[] = {1, 2, 3, 4};

a = a + 1;    //error

3. 变量、常量和常量指针

a.

int i = 10;

int const *pi = &i;

*pi = 11;    //error

i = 11;    //ok

上述语句只是说明 pi 指向的地址中所存的内容不能通过 *pi 的方式被改变;

b.

const int ci = 10;

const int* pci = &ci;

*pci = 11;    //error

ci = 11;    //error

上述语句说明 ci 是一个常量,存放在常量区,不能被改变,pci 指向的地址中所存的内容不能通过 *pci 的方式被改变;

c.

const int ci = 10;

int* pci = &ci;    //error

上述语句说明 ci 是一个常量,存放在常量区,不能被改变,也不能通过 *pci 的方式被改变,所以指向 ci 的指针必须是常量指针。

总结:

const int* p;    //语句1

int const *p;    //语句2

int* const p;    //语句3

在前先读,在前不变

*(指针) 和 const(常量)谁在前先读谁;

* 代表被指的数据,名字代表指针地址;

const 在谁的前面谁就不能被改变。

④ 语句1 和语句2 等价