关于实例声明:C++中指针常量和常量指针的问题

本文详细解析了C++中指针常量与常量指针的区别,并通过具体的例子阐述了Specifier与Declarator的概念,帮助读者更好地理解这些复杂概念。

      在C++指针常量和常量指针的学习中,我们经常会碰见这样的例子:

A. const char *pContent;

B. char * const pContent;

C. char const *pContent;

 

      为了便于理解,很多教材是这么加括号的:

A. const (char) *pContent;

B. (char*) const pContent;

C. (char) const *pContent;

 

      也许这样对理解指针常量和常量指针的用法会有一定的帮助,但严谨的来说,将 char 与 * 放在一起是错误的,因为两者的性质根本不同。在C++中,实例(Object)的声明其实包含两部分:Specifier 和 Declarator,在上面的例子中,char 属于 Specifier,而 * 则属于Declarator,const 则根据其位置的不同处于不同成分。

 

      在《Cpp in a Nutshell》一书中,有如下的说明:

Specifier:contain a storage class, const and volatile qualifiers, and the object's type, in any order.

      例子:extern const long int objectname;

      其中 extern 属于存储类型(storage class),const 属于 cv-qualifiers,long int 属于变量类型。它们的顺序任意,也就是说上面的例子等价于:int const extern long objectname;

 

Declarator:contains the name being declared, additional type information (for pointers, references, and arrays), and an optional initializer

      例子:int plain_int, array_of_int[42], *pointer_to_int;

      其中整个句子是一个实例声明,而前面的 int 是 specifier,它的内容同时作用于后面跟着的三个 declarator,分别是 “plain_int" (只有标识符),”array_of_int[42]“(标识符和数组修饰),”*pointer_to_int“(指针修饰和标识符)。另外初始化的部分也属于 declarator,specifier 和 declarator 一起组成了实例声明,如:int a = 1, b = 2, c = 3;

 

      好了,回到指针常量和常量指针的例子:char * const pContent;

      这是一个实例声明,所以包含了specifier和declarator两部分,两者以 *(&,标识符)为界,分为两部分:

Specifiers: char

Declarators: * const pContent

      所以,这是一个指向char类型数据的常量指针。同理:

 

A. const char *pContent;

Specifiers: const char

Declarators: *pContent

C. char const *pContent;

Specifiers: char const

Declarators: *pContent

 

      又或者:

const char * const pContent;

Specifiers: const char

Declarators: * const pContent

 

      简单的说, *(&,标识符)及其以后的部分都属于 declarators,只要抓住了这一点,无论是多复杂的指针常量和常量指针都能够很容易地区分开来。

C++中,指针常量的使用规则是编程基础的重要组成部分,尤其是在华为这样的技术公司面试笔试中经常被考查。理解这些概念对于通过面试至关重要。 参考资源链接:[华为软件开发面试笔试题集锦](https://wenku.csdn.net/doc/5pe1ovbtsx?spm=1055.2569.3001.10343) 首先,我们需要明确指针常量声明时的位置不同,会影响它们的含义。指针可以指向常量,也可以是一个常量指针;同样,常量可以位于指针所指向的数据之前,也可以位于指针变量之后。这些细微的差别会直接影响指针的行为限制。例如: 1. 指针指向常量:`const int* ptr;` 或 `int const* ptr;` 这两种声明都表示ptr是指向常量指针。这意味着,通过ptr指针不能修改它所指向的值,但ptr本身的值(即它所指向的地址)是可以改变的。 2. 常量指针:`int* const ptr = &var;` 这里声明了一个常量指针,表示ptr本身的值(所指向的地址)不能被修改,但可以通过ptr修改它所指向的值。 3. 指向常量常量指针:`const int* const ptr;` 这是最严格的限制,意味着ptr既不能改变它所指向的地址,也不能通过ptr修改它所指向的值。 在实际编程中,正确使用指针常量可以提高代码的健壮性安全性。例如,在处理只读数据或者传递参数给函数时,使用常量指针可以防止数据被意外修改。而在设计接口时,使用指向常量指针可以允许多个函数共享同一数据资源而不破坏数据的完整性。 了解这些规则后,建议深入研究《华为软件开发面试笔试题集锦》中的相关题目,以获得实际编程问题的解决方案更多的实例。这份资料将帮助你更好地准备面试,并在实际工作中应用所学知识。 参考资源链接:[华为软件开发面试笔试题集锦](https://wenku.csdn.net/doc/5pe1ovbtsx?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值