c++指向常量的指针和指向变量的指针常量
2018-01-24 10:58
302 查看
1.const int *p
就是所谓的“指向常量的指针”。这里注意,所谓“指向常量”只是这个指针的“一厢情愿”,只是一种效果上的等价。事实上,const int *p=&a;a既可以是常量(const int a=10;)又可以是变量(int a=10;),但p一厢情愿地认为它所指的就是一个常量,所以它不允许通过自己来修改所指,这就造成一种效果上的等价——从p的角度看,它所指的“的确”是常量。所以,对“指向常量的指针”的最佳理解应为:我们不能通过该指针修改它所指向的东西(常量或者变量)。
注意,const int *p=&a;只是说不能通过p来修改a,如果a本身不是const的,通过其它方式修改a自然是可以的(例如直接++a)。
另外一点,由于p本身只是一个普通的指针,所以允许在声明时不初始化。但需要注意的是,我们只是说可以,但并不提倡这样做。在任何时候都不应该让指针无所指,如果在声明一个指针时还不知道让它指向谁,就先将其初始化为nullptr或NULL(nullptr是C++11新特性,用它比用NULL更安全些,这里不详细介绍)。
2.int* const p
就是所谓的“本身是常量的指针”。关于“p本身不能修改但可以通过p修改其所指”这一点,我们在讲判断方法时已经说过,这里主要再说一下p的初始化。
由于p本身是const的,所以在编译的时候必须知道p的值(即p所指向的东西的地址),所以在声明p的同时必须初始化p。但要注意,对于 int* const p=&a,我们只要求a的地址是确定的,但a的值可以不确定。比如下面的代码是可行的
由于声明了int b,所以b的地址在编译时是确定的,但很显然,b的值只要在程序运行时才能确定。
另外注意,用nullptr或NULL初始化int* const p没有问题,因为nullptr和NULL都代表有效地址。
3.const int* const p
就是所谓的“所指和本身都是常量的指针”。它的语法特性就是前两者的结合,这里不再赘述。
4.引用和指针
在上面的代码中,编译器将int &ra=a转化为int* const ra=&a,而将ra=11转化为*ra=11,将ra自动转化为*ra的过程,就是上面定义中所说的“自动解引用”。
那么,什么是const引用(即我们说的常量引用,但我希望大家称其为const引用而不是常量引用)呢?很显然,const int &ra=a就相当于const int* const ra=&a了。相信通过前面的讲解,这里不用在下多说了。
就是所谓的“指向常量的指针”。这里注意,所谓“指向常量”只是这个指针的“一厢情愿”,只是一种效果上的等价。事实上,const int *p=&a;a既可以是常量(const int a=10;)又可以是变量(int a=10;),但p一厢情愿地认为它所指的就是一个常量,所以它不允许通过自己来修改所指,这就造成一种效果上的等价——从p的角度看,它所指的“的确”是常量。所以,对“指向常量的指针”的最佳理解应为:我们不能通过该指针修改它所指向的东西(常量或者变量)。
注意,const int *p=&a;只是说不能通过p来修改a,如果a本身不是const的,通过其它方式修改a自然是可以的(例如直接++a)。
另外一点,由于p本身只是一个普通的指针,所以允许在声明时不初始化。但需要注意的是,我们只是说可以,但并不提倡这样做。在任何时候都不应该让指针无所指,如果在声明一个指针时还不知道让它指向谁,就先将其初始化为nullptr或NULL(nullptr是C++11新特性,用它比用NULL更安全些,这里不详细介绍)。
2.int* const p
就是所谓的“本身是常量的指针”。关于“p本身不能修改但可以通过p修改其所指”这一点,我们在讲判断方法时已经说过,这里主要再说一下p的初始化。
由于p本身是const的,所以在编译的时候必须知道p的值(即p所指向的东西的地址),所以在声明p的同时必须初始化p。但要注意,对于 int* const p=&a,我们只要求a的地址是确定的,但a的值可以不确定。比如下面的代码是可行的
#include<iostream> using namespace std; int GetData(int num) { return num; } int main() { int a; cin >> a; int b = GetData(a); int* const p = &b; cout << *p << endl; return 0; }
由于声明了int b,所以b的地址在编译时是确定的,但很显然,b的值只要在程序运行时才能确定。
另外注意,用nullptr或NULL初始化int* const p没有问题,因为nullptr和NULL都代表有效地址。
3.const int* const p
就是所谓的“所指和本身都是常量的指针”。它的语法特性就是前两者的结合,这里不再赘述。
4.引用和指针
int a = 10; int &ra = a; ra = 11;
在上面的代码中,编译器将int &ra=a转化为int* const ra=&a,而将ra=11转化为*ra=11,将ra自动转化为*ra的过程,就是上面定义中所说的“自动解引用”。
那么,什么是const引用(即我们说的常量引用,但我希望大家称其为const引用而不是常量引用)呢?很显然,const int &ra=a就相当于const int* const ra=&a了。相信通过前面的讲解,这里不用在下多说了。
相关文章推荐
- C/C++学习笔记:指向类成员变量的指针
- 重学C++ 指向常量数据的常量指针
- C++ 指向常量的指针与常指针
- C++指向结构体变量的指针
- C/C++中指向结构体变量的指针,调用指向的那个结构体中的成员
- C++中对常量指针和 指向常量的指针等组合声明的理解
- 从汇编看c++中指向成员变量的指针(一)
- C++指向常量的指针和常指针
- [C++基础]018_常量指针和指向常量的指针
- [C++基础]018_常量指针和指向常量的指针
- 【C/C++】常量指针、指针常量以及指向常量的指针常量
- C++ 常量指针 指向常量的指针
- 修改常量指针所指向变量的方法
- [C++] C++指针的那些事 -- 常量,变量,指针及指针相关的三个数值
- 深入探讨常量、指向常量的指针,常量与变量的区别
- C/C++ 指向常量的指针和常量指针
- 从汇编看c++中指向成员变量的指针(二)
- 【C++】指向结构体变量的指针
- 详解C++中的指针结构体数组以及指向结构体变量的指针
- 指向常量的指针常量,指向变量的指针常量,指向常量的指针变量的区别