const/volatile修饰标识符的进一步论证
const int *p = NULL; 相当于 int const *p = NULL;
下面要写一对与上面一对表达式更清晰的陈述:
const int (*p) = NULL; 相当于 int const (*p) = NULL;
这样其实比起第一对看起来更加清晰。const修饰(*p),即限定p指针所指地址内容的值。
再看下面:
int * const p = NULL;
更清晰地表述为:int (* const p) = NULL;
这样,很明显可以看到const修饰标识符p,即限定p指针的值。
要注意的是没有int (const * p) = NULL;这样的语法。
因为这样一来,对int的修饰会产生冲突。由于const *p对于C/C++而言本身就是一个合法的正则表达式语句。const *p = NULL; 完全OK,这时p作为int const*类型。
利用括号对指针类型进行限定是比较有用的分析技巧。
比如说以下情况:
typedef int ARRAY[10];
void main(void)
{
ARRAY *p; // p是什么类型?
}
那么对于类型定义情况,我们公司很多程序员都搞不清楚。尤其像以上这种情况。
加个括号看看:ARRAY (*p);
分析:由于ARRAY是int[10]类型,将它代入就成为:int[10] (*p);
调整一下:int (*p)[10]; 所以比较自然地得出了p的类型为:int(*)[10]。
指针标记*与标识符靠拢时总是与标识符进行一同规归约。
typedef const int CINT;
CINT *p = NULL; // p是什么类型?
同样地,加括号:CINT (*p) = NULL; 就和const int (*p)一样了。
typedef int* PINT;
PINT const p = NULL; // p是什么类型?
同样地,加括号,不过这里实际上没什么必要了,因为p作为一个单独的标识符没有指针对它进行修饰。const PINT (p) = NULL; 由于PINT为(int*)类型,因此这里的const就是对标识符p作修饰,由于p已经为(int*),因此p的类型为int* const。
若为:PINT const (*p) = NULL;那么p类型为:int* const *。第一个int*是由PINT得到的。
若是:PINT (* const p) = NULL; 那么p类型为int* * const
下面要写一对与上面一对表达式更清晰的陈述:
const int (*p) = NULL; 相当于 int const (*p) = NULL;
这样其实比起第一对看起来更加清晰。const修饰(*p),即限定p指针所指地址内容的值。
再看下面:
int * const p = NULL;
更清晰地表述为:int (* const p) = NULL;
这样,很明显可以看到const修饰标识符p,即限定p指针的值。
要注意的是没有int (const * p) = NULL;这样的语法。
因为这样一来,对int的修饰会产生冲突。由于const *p对于C/C++而言本身就是一个合法的正则表达式语句。const *p = NULL; 完全OK,这时p作为int const*类型。
利用括号对指针类型进行限定是比较有用的分析技巧。
比如说以下情况:
typedef int ARRAY[10];
void main(void)
{
ARRAY *p; // p是什么类型?
}
那么对于类型定义情况,我们公司很多程序员都搞不清楚。尤其像以上这种情况。
加个括号看看:ARRAY (*p);
分析:由于ARRAY是int[10]类型,将它代入就成为:int[10] (*p);
调整一下:int (*p)[10]; 所以比较自然地得出了p的类型为:int(*)[10]。
指针标记*与标识符靠拢时总是与标识符进行一同规归约。
typedef const int CINT;
CINT *p = NULL; // p是什么类型?
同样地,加括号:CINT (*p) = NULL; 就和const int (*p)一样了。
typedef int* PINT;
PINT const p = NULL; // p是什么类型?
同样地,加括号,不过这里实际上没什么必要了,因为p作为一个单独的标识符没有指针对它进行修饰。const PINT (p) = NULL; 由于PINT为(int*)类型,因此这里的const就是对标识符p作修饰,由于p已经为(int*),因此p的类型为int* const。
若为:PINT const (*p) = NULL;那么p类型为:int* const *。第一个int*是由PINT得到的。
若是:PINT (* const p) = NULL; 那么p类型为int* * const
...全文
相关推荐
extern_volatile等修饰符的用法
extern_volatile等修饰符的用法
static,const,volatile用法
static,const,volatile用法的解析,对三项中全局变量和局部变量的区分,volatile中介绍了其具体用法 和一些区别,bong有例子
C++中const、volatile、mutable使用方法小结
主要介绍了C++中const、volatile、mutable使用方法小结,需要的朋友可以参考下
Const与Volatile
详细介绍Const与Volatile的相同与不同
C语言中const,volatile,restrict的用法总结
1. const 变量声明中带有关键词const,意味着不能通过赋值,增量或减量来修改该变量的值,这是显而易见的一点。指针使用const则要稍微复杂点,因为不得不把让指针本身成为const和指针指向的值成为const区别开来、下面的声明表示pf指向的值必须是不变的 constfloat *pf;而pf则是可变的,它可以指向另外一个const或非const值;相反,下面的声明说明pf是不能改变的,而pf所指向的值则是可以改变的: float* const pf; 最后,当然可以有既不能改变指针的值也不能改变指针指向的值的值的声明方式: constfloat * const pf; 需要注意的是,


