"); //-->
作者:杨硕,华清远见嵌入式学院讲师。
C语言为我们定义了四种基本数据类型:整型,浮点型,指针以及聚合类型(数组和结构体等),在此基础上,我们就可以声明变量。我们平时经常说定义一个某种类型的变量,其实这样说不确切,应该说是声明变量。
变量声明的基本形式是:
说明符(一个或多个) 声明表达式列表
比如说:int a, b, c, d;
C语言中对指针的声明比较有代表性,我们来看一下:
比如声明一个指向int型的指针a:int *a;
这个语句表示表达式*a产生的结果类型是int,而我们又知道*操作符执行的是间接访问操作,所以可以推断a肯定是一个指向int的指针。
C语言在本质上是一种自由形式的语言,它给了程序员很大的空间,我们同样可以这样写:int* a,这个声明与int *a时一个意思,而且似乎更为清楚,a被声明为类型为int*的指针(实则不然),这会诱导我们这样声明三个指向int型的指针:
int* a, b, c;
也许你会很自然的以为这条语句把三个变量a、b、c都声明为指向整型的指针,但是事实上我们被它的形式愚弄了,星号实际上是表达式*a的一部分,只对这个标识符有用,a是一个指针,但是b和c都只是普通的整型而已,要声明三指针,这样写是可以的:
int *a, *b, *c;
从这个简单的例子我们可以看出C语言的声明规则多么具有迷惑性,呵呵,这也是C语言饱受批评的地方之一,但这决定与语言本身的设计哲学,我们无法改变,要想用好C语言,我们必须掌握它的语法规则。
我们再看一个例子:
int fun();
我们都知道它把f声明为一个函数,它的返回值是一个整数。
如果这样写:
int *fun();
要想推断出它的含义,我们必须知道*fun()是如何求值的。首先执行的是函数调用操作符(),因为它的优先级高于间接访问操作符*,所以fun是一个函数,它的返回值类型是一个指向整型的指针。
再看一个更为有趣的声明:
int (*fun)();
这个声明有两对括号,每对括号的含义不同。第二对括号是函数调用操作符,但是第一对只起到聚组的作用。它导致间接访问在函数调用之前进行,使fun是一个函数指针,它所指向的函数返回一个整型值。
那么现在这个声明应该很容易分析出来了
int *(*fun)();
fun还是一个函数指针,只是所指向的函数返回的是一个整型指针。
先写到这里,对C语言的声明之旅才刚刚开始,下回我们将在中级篇里讨论更有趣的话题!
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
新型功率器件的老化特性:HTOL高温工况老化测试
简易相序指示器
鉴别线圈的同名端
电源产品的可靠性设计(下)
请教一个关于创建信号量的初级问题,请大家看一下!谢谢!
请教VxWorks中网络设置问题?
电源产品的可靠性设计(上)
工业自动化分论坛:多维技术赋能,工业自动化迈向新高度
亚超声笛遥控风扇调速伴海浪发声电路
okkkkkkkk
T/R-40系列通用型超声波发射/接收传感器电路图
[讨论]关于Vxworks和MPC860中断向量表的问题
美国芯片巨头英特尔、美光、高通和德州仪器均已向美国商务部提交评论,寻求减轻预期美国半导体进口关税的负担或获得免税。
简单的停电自锁开关
Bourns全新扩展PDB241-GTR系列吉他电位器
向大家推荐一个好的硬件开发、软件编程多媒体教学网站
LM1812构成汽车倒车防撞报警器电路图
NCL30000单段式功率因数校正LED驱动器原理及TRIAC调光LED驱动器设计方案(下)
电源产品的可靠性设计(中)
英特尔支持 AI 工作站配备新的 GPU 和 AI 加速器
超声波遥控电风扇变速伴海浪声电路(一)
英飞凌推出PSOC 4100T Plus MCU,在单块芯片中集成先进的传感和系统控制功能
LMl812构成0~6m测距电路
国产半导体重大并购,能否实现算力突围?
电源设计好,硬件成功一半
检查双向晶闸管的好坏(方法之一)
实现更安全、更面向未来的电池设计:肖特推出无铅* SEFUSE三端保险丝
如何在LTspice中添加电压控制开关
简易马达调速器
NCL30000单段式功率因数校正LED驱动器原理及TRIAC调光LED驱动器设计方案(上)