来源:牛客网
int b;
1.const int *a = &b;
2.const * int a = &b;
3.const int* const a = &b;
4.int const* const a = &b;
3,4是相同的。
int const *a 和 const int *a 意义相同,作用等价 同理,本题3、4意义相同
第2个语法错误,没有这种写法。
// p指向的变量为常量: const int * p; int const * p; // p为常量: int * const p = 0; // p及指向的变量都是常量: const int * const p = 0; int const * const p = 0;. 小结:(1)常量必须初始化; (2)const的结合为右结合:const p与const *p。
const类型限定符
才疏学浅,资历欠佳,难免有误,望有心人批评指正。
序号 | const类型限定符说明 | |
---|---|---|
1 | 位置 | 类型关键字的前面 |
实例 | int a,b;const int *p=&a; | |
说明 | p是一个指针变量,指向一个整型常量,则它表明** *p 是一个常量,而 p 不是,由于 *p 是只读的,是不可以在程序中被修改的,所以,一旦将 *p 作为左值在程序中对其赋值,将被视为非法操作,但是 p 指向的变量 a 是可以修改的,因此 **p=&b是合法的操作。 | |
2 | 位置 | 类型关键字的后面,* 变量名的前面 |
实例 | int const *p=&a; | |
说明 | p是一个指针变量,指向一个整型常量,则它表明* *p 是一个常量,而 p 不是*,*p 是只读的,是不可以在程序中被修改的,基本上同 1 | |
3 | 位置 | 类型关键字 * 的后面,变量名的前面 |
实例 | int* const p=&a; | |
说明 | p 是一个常量指针,可指向一个整型,它表明** p 是一个常量,而 *p 不是,p 是只读的,是不可以在程序中被修改的,所以,一旦将 p 作为左值在程序中对其赋值,将被视为非法操作,但是它指向的变量的值是可以修改的,因此 **p=&b是非法的操作,而*p=20是合法操作,同 1 相反。 | |
4 | 位置 | 一个在关键字前,另一个在关键字之后 * 之后和变量名之前 |
实例 | const int* const p=&a; | |
说明 | p是一个指针常量量,指向一个整型常量,它表明 *p 和 p 都是常量,都是只读的,则*p=20 和 p=&b 都是非法操作 |
来源:牛客网下列哪两个是等同的int b;
1.const int *a = &b;
2.const * int a = &b;
3.const int* const a = &b;
4.int const* const a = &b;
3,4是相同的。
int const *a 和 const int *a 意义相同,作用等价 同理,本题3、4意义相同
第2个语法错误,没有这种写法。
一个比较经典的问题——问以下两种声明的区别:
1) const char * p
2) char * const p这里的 const 关键字是用于修饰常量,书上说 const 将修饰离它最近的对象,所以,以上两种声明的意思分别应该是:
1) p 是一个指向常量字符的指针,不变的是 char 的值,即该字符的值在定义时初始化后就不能再改变。
2) p 是一个指向字符的常量指针,不变的是 p 的值,即该指针不能再指向别的。现在倒是正确说出了两者的意思,但应该怎样记忆它们呢?
至少我觉得我经常会忘记,以后再遇到了可能又会混淆不清。-_- !无意间,在网上看到有人介绍了一种不错的记忆方法,分享如下:
Bjarne 在他的《The C++ Programming Language》里面给出过一个助记的方法——“以 * 分界,把一个声明从右向左读”。
注意语法,* 读作 pointer to (指向...的指针),const (常量) 是形容词,char (变量类型) 和 p (变量名) 当然都是名词。
1) const char * p 读作:p is a pointer to a const char,译:p 是一个指针(变量),它指向一个常量字符(const char)。
2) char * const p 读作:p is a const pointer to a char,译:p 是一个常量指针(const p),它指向一个字符(变量)。从两处蓝色标记也能看出前面提到的“const 修饰离开最近的对象”的说法。
另外请再注意下面的情况。
先看 const int a 和 int const a,这里没有分界符 *,虽然 const 的位置不同,但意思不变,它 const 修饰的是 int,常量整数。
再看 const char * p 和 char const * p,首先以 * 分界,虽然 const 的位置改变了,但它都是在修饰 char,常量字符。