一、指针考察
请看下面三种定义:
const char *p;
char const *p;
char * const p;
请问三者有什么区别?
先看第一种,先看p,根据优先级它和*结合,是指针,指向char类型,但是char前面有一个const修饰,所以p所指向的内容为const类型不可修改。
第二种:由于没有const *的运算,若出现const *的形式,则const实际上是修饰前面的,所以char const *p和const char *p一样。
第三种情况:const修饰的是p,p不能修改。
根据图示,p所指向的内容可以修改。而如果试图修改p的值,如下图
总结:
const char *p; // 声明一个指向字符或字符串常量的指针(p所指向的内容不可修改)
char const *p;// 同上
char * const p;//声明一个指向字符或字符串的指针常量,即不可以修改p的值,也就是地址无法修改。
二、指针和引用
指针:指针是一个变量,只不过这个变量中存储的是一个地址,指向内存中的一个单元。
引用:引用和原变量是同一个东西,只不过是原变量的一个别名。
int a = 10; 定义一个整型变量a
int *p = &a; 定义一个指向整型变量的指针变量p,该指针指向a的存储单元,即p的值是a存储单元的地址
int &b = a; 定义一个整型变量a的引用,a和b是同一个东西,在内存中占用同一个存储单元
三、函数指针
int (*p)[3] 数组指针,p是一个指针,指向1个有3个变量的数组
int*p[3]指针数组,p是一个有3个元素的数组,每个元素的类型是整形指针
int (*p)(int)是函数指针,如:
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
int* p(int x);是一个返回值为int型指针的函数的声明
可以用typedef 定义函数指针类型,用于定义函数指针;