天天看点

常量指针,指针常量,指向常量的指针常量

迫于面试的压力,在网上收集了一些关于指针常量、常量指针和指向常量的指针常量的资料。这些概念也确实让你头晕;

------------------------------------------------------------------------------------------------------------------------------------------

http://www.zhihu.com/question/19829354

const:具有const限定类型的左值表达式的值无法修改。使用const限定符的意图是表示值不会变化的变量。

const int p; //表示P不能作为赋值表达式的左操作数,也不能作为增值和减值操作符的操作数,即不允许变化的变量。
const int *p; //常量指针,表示指向常量数据的指针
int const *p; //常量指针,表示指向常量数据的指针
int * const p ="abc" ; //指针常量
const int * const p = "de"; //指向常量的指针常量
           

为了一次性彻底说明问题,个人觉得有必要从定义严格说明,特此引进概念“声明器”,声明器引进了被声明内容的名字,同时也提供了额外的类型信息。声明器包括:指针声明器、直接声明器。而直接声明器又包括:简单声明器、函数声明器、数组声明器。

为了更好的理解,首先看一个简单声明器的例子,假设T是个类型指定符,id是任何标识符

。下面这个声明:

T id;//表示id是T类型的,此时,id被称为简单声明器。

转回正题,再看指针声明器。

指针声明器(格式):

指针 直接声明器

指针:* 类型限定符(可选) //类型限定符即所说的const

同样,一个指针声明器的例子,假设D是封装了标识符id的任何声明器,下面这个声明:

T *D;//表示id的类型是“……指向类型T的指针”。

如果在指针声明器内出现了类型限定符,即* const D形式(const只是类型限定符的一种),那么限定符作用于指针,而不是作用于指针所指向的对象。例如,int * const p; //指针常量,const作用于指针本身。

如果在指针声明器外出现了类型限定符,即 const T (*D)或 T const (*D)形式,那么限定符作用于类型T。例如,int const *p;或 const int *p;//指向常量数据的指针,const作用于int。

--------------------------------------------------------------------------------------------------------------------------------------

指针常量和常量指针的举例:

http://www.cppblog.com/cc/archive/2006/03/12/4045.html

---------------------------------------------------------------------------------------------------------------------------------------

常量指针:指向常量的指针,指针指向的内存地址的内容是不可以修改的,指针指向的内存地址可以修改。

指针常量:指针指向的地址是不可以修改的,指针指向的内存地址的内容是可以修改的。指针常量必须在声明的同时对其进行初始化,不允许先声明一个指针常量后再对其赋值。

指向常量的指针常量:是一个常量,指针指向的内存地址及其内容均不可以修改。