Chinaunix首页 | 论坛 | 博客
  • 博客访问: 400213
  • 博文数量: 87
  • 博客积分: 1171
  • 博客等级: 少尉
  • 技术积分: 1068
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-19 14:34
文章分类

全部博文(87)

文章存档

2014年(10)

2013年(24)

2012年(53)

我的朋友

分类: C/C++

2013-07-09 14:14:09

http://www.cnblogs.com/jingd/archive/2013/03/29/2989628.html

c语言复杂变量声明(数组、指针、函数)

最近重新研读了c语言指针方面的资料,现在对c语言中复杂声明进行总结。

这里指的复杂声明指的是解读像下面这种声明代码含义的。

int (*(*x)(int *,char *))(int);

(以上代码声明了一个函数指针,这个函数接收一个整型指针和一个字符指针作为参数,函数指针,这个函数接收一个整型参数,返回一个整型。)

c语言变量的声明始终贯彻两点:

1.声明和使用的语法尽量保持一致

例如:声明一个函数指针

double (*fun)(double);

使用这个函数指针

#include 
fun=sin;
doube reslut=(*fun)(0.5);//use point fun

2.声明语句不是的阅读不是按照从左往右的阅读顺序,而是要根据各个符号的优先级进行阅读的

这一点非常重要,是判断一个声明到底是声明了一个什么变量的准则。具体讲有三类声明符:

*   ()   [ ]

其中“*”声明指针,各种各样的指针,包括函数指针;

“()”是专门用来声明函数指针的;

“[ ]”是用来声明数组的。

三个运算符“[ ]”和“()”的优先级别最高,结合律是“自右向左”。

明确了这两点后,我们就可以使用这两点来解读复杂声明了。

具体规则:首先从声明的变量符开始根据优先级进行阅读,判断定申明了一个什么变量。然后一层一层逐级向外拆开。*则申明了指针;[ ]则申明了数组;()则申明了函数。

例如解读本文一开始的例子:

int (*(*x)(int *,char *))(int);

首先找到x,然后根据优先级找到*x,则证明整条语句声明了一个指针。再继续看到(*x)右边是一个()符,则证明x是一个指向函数的指针,既然是函数指针那剩下的部分就是描述函数返回值类型和参数类型;再看()里则可以解读出函数的输入是一个整型指针和一个字符指针。然后再以“(*x)(int *,char *)”为整体看,找到优先级最高的是*符号,则证明返回值是一个指针;再继续看找到了(int)则证明这个指针是指向一个函数的,函数的参数是整型;再继续找到最后一个int,则看出这个函数的返回值是一个整型。到此解读完毕。

简要的说就是:声明了一个函数指针,这个函数接收一个整型指针和一个字符指针作为参数,返回函数指针,这个函数指针指向的函数接收一个整型参数,返回一个整型。

 

double(*(*y[3])())[10]

 

同理:这里又声明了一个长度为3的数组,数组元素为函数指针,指向的函数返回一个指针,该指针又指向仪个长度为10的double型数组。

阅读(647) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~