现在总结指针的更高一级的用法,其中指向函数的指针在我的博文中已经单独介绍过了,将会补充介绍几点,现在介绍别的指针的用法。
首先介绍几个陷阱:
int f()[];
int f[]();
这两个声明都是非法的,如果有人问这两个声明什么意思,我们应当不加思索的说出这是错误地声明,博主就曾经苦苦思考过这两个声明的意思,现在想想都觉得可笑。
现在对于指向函数的指针补充几点:
例如:
int (*pf)(int)=&f;
现在创建了一个函数指针,并把它初始化为指向函数f,其实初始化表达式的&操作符是可选的,因为函数名被使用时总是由编译器把它转化为函数指针。&操作符只是显示的说明了编译器隐式的执行的任务。
函数名首先被转换为一个函数指针,该指针制定函数在内存中的位置。
除了函数指针还有一个重要的用法就是转化表。就是使用void进行泛型的计算。
我的博文void与泛型计算已经比较清楚的说明了这一问题。
指针最后一个高级应用实例就是命令行参数的使用,也已经介绍过了。
现在介绍关键字const.
const可以创建数组常量,指针常量,以及指针常量的指针。
通常把指向常量的指针用作函数参量,以表明函数不会引用这个指针来修改数据。
void show_array(const double *ar ,int n)
关于指针赋值和const有一些规则要注意,首先将常量或非常量数据的地址赋给指向常量的指针是合法的。
int rates[10]={0};
const double *p=rates;
然而只有非常量数据的地址才能赋给普通指针:
const double a;
p=a;非法
double *p=rates;合法
声明一个指向固定的地址的指针:
double *const p=rates;这个指针指向数组的第一个元素的地址并且不能改变。
可以使用两个const来进行声明:
const double *const p=rates;不可以修改指针的值和指针指向的内容。