您的位置:首页 > 编程语言 > C语言/C++

编程能力提高-----C/C++指针详解

2016-08-04 00:39 211 查看
        指针是C/C++的灵魂,要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型。一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了左右法则:

       The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When
you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.

   右左法则:首先从最里面包含未定义标识符的圆括号看起,然后往右看,再往左看(根据运算符优先级结合)。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。

     下面让我们先从简单的类型开始慢慢分析吧:=======》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

<pre name="code" class="cpp">int p;   //这是一个普通的整型变量

int *p;
/*首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int结合,说明指针所指向的内容的类型为int 型.所以P 是一个返回整型数据的指针*/

int p[3];
//首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组

int *p[3];
/*首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组*/

int (*p)[3];
/*首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针*/

int **p;
/*首先从P 开始,先与*结合,说是P 是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.*/

int p(int);
/*从P 处起,先与()结合,说明P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数然后再与外面的int结合,说明函数的返回值是一个整型数据*/

int (*p)(int);
/*从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针*/

int (*func)(int *p);
/*首先找到那个未定义的标识符func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是int。*/

int (*func)(int *p, int (*f)(int*));
/*func被一对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int *和int (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。*/

int *(*p(int))[3];
/*从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P是一个参数为一个
整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数.*/

void * (*(*fp1)(int))[10];
/*fp1是一个指向函数的指针,该函数带一个int参数并返回一个指向有10个void指针元素的数组的指针*/

float (*(*fp2)(int,int,float))(int);
/*fp2是一个指向函数的指针,该函数带3个参数,并返回一个指向函数的指针,这个函数带int参数并返回float值*/

//用typedef定义函数指针类型:
typedef double (*(*(*fp3)())[10])();//fp3可以作为类型来定义函数指针
fp3 a;
/*fp3是一个函数指针类型,fp3类型的a,是一个指向函数的指针,该函数无参数,返回一个指向有10个指向有10个指向函数指针的数组的指针,
这些函数不带参数且返回double值*/



//demo:
int *p[10];
int (*q)[10];
printf( "*p[10]: %d\n ", sizeof(p));
printf( "(*q)[10]: %d\n ", sizeof(q));
结果是:
*p[10]: 40 //说明p是一个数组名
(*q)[10]: 4 //说明q是一个指针


助记

指针的类型:从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。

指针所指向数据的类型:从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。

提醒:

不过我们一般不会用太复杂的类型,那样会大大减小程序的可读性,请慎用,这上面的几种类型已经足够我们用了.

指针的总结,未完待续........

转账请注明出处:http://blog.csdn.net/so_geili/article/details/52109207
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: