一.C语言声明的优先级规则(C专家编程)
A 声明从它的名字开始读取,然后按照优先级顺序依次读取。 B 优先级从高倒低依次是: B.1 声明中被括号括起来的那部分 B.2 后缀操作符:括号()表示这是一个函数,而方括号[]表示这是一个数组。 B.3 前缀操作符:星号*表示"指向...的指针"。 C 如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用与类型说明符。在其它情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。
二.实例:
对于下面的三种声明:
const int * grape; int const * grape; int * const grape_jelly;
按照C语言声明的优先级规则,在最后一种情况下,指针是只读的,而在另外两种情况下,指针所指向的对象是只读的。
当然对象和指针有可能都是只读的,像下面的声明:
const int * const grape_jam; int const * const grape_jam;
三.测试代码:
当你对只读的指针进行赋值时,编译时不能通过:
#include <stdio.h> int main() { int a=12,b=13; int * const ap=&a; /*当前指针是只读的,也就是说指针不能指向其它变量了!*/ ap=&b; printf("%d ", *ap); return 0; }
eclipse中提示的错误:错误:向只读变量‘ap’赋值
当然,我们依然有办法对只读的指针变量进行赋值:
#include <stdio.h> int main() { int a=12,b=13; int * const ap=&a; /*当前指针是只读的,也就是说指针不能指向其它变量了!*/ *(int **)&ap=&b; printf("%d ", *ap); return 0; }