C++学习之typedef
来源:互联网 发布:网络存储工程师待遇 编辑:程序博客网 时间:2024/06/10 16:48
用途1:
定义一种类型的别名,但不是像#define那样简单的宏替换,它可以用作同时声明指针型的多个对象。
但是有一个问题需要注意:
用途2:
简化struct结构的声明。
用途3:
用途4:
理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例: int (*func)(int *p); 首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。 int (*func[5])(int *); func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。
另外:【函数指针】
在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。
1.函数指针定义
函数类型 (*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:
int (*f)(int x);
double (*ptr)(double x);
在定义函数指针时请注意:
函数指针和它指向的函数的参数个数和类型都应该是—致的;
函数指针的类型和函数的返回值类型也必须是一致的。
2.函数指针的赋值
函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。
例如,
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
3.通过函数指针调用函数
函数指针是通过函数名及有关参数进行调用的。
与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。
由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:
首先,要说明函数指针变量。
例如:int (*f)(int x);
其次,要对函数指针变量赋值。
例如: f=func; (func(x)必须先要有定义)
最后,要用 (*指针变量)(参数表);调用函数。
例如: (*f)(x);(x必须先赋值)
为复杂的声明定义个新的简单的方法,基本方法是:在原来的声明里逐步用别名替换一部分复杂的声明,如此循环,就可以把带有变量名的部分留到最后替换,得到的就是原声明的简化版。
用typedef来定义与平台无关的类型。
- C语言学习之typedef
- C语言深度剖析之typedef学习
- C语言之typedef
- C语言之typedef
- C语言之typedef
- 《C和指针》学习笔记之typedef的使用
- 【黑马程序员】C语言学习笔记之typedef(十五)
- 黑马程序员IOS基础---C语言学习之typedef
- C++学习之typedef
- c语言之typedef别名
- C语言笔记之typedef
- C语言之关键字typedef
- C语言之typedef详解
- C专家编程学习笔记——第三章(四):C语言声明之 typedef
- 黑马程序员----C 语言学习笔记之枚举类型和typedef关键字
- (五)JNI学习之C语言基础,typedef与宏定义
- C语言学习大纲--typedef的使用
- C语言学习入门 (八) typedef 关键字
- Android学习之Platform总线 1
- spring2.0基于Annotation的AOP实现以及AOP事务
- SoAlarmSensor
- Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
- ExtJS--Extjs中创建或得到record和store的几种方法代码
- C++学习之typedef
- linux下maven的安装
- Ubuntu11.04常用软件
- xcode
- WAS 6.1 部署遇到一些问题
- 关于struts2标签取值的备忘录
- 【经验总结】浅谈 bash I/O操作
- 删除多余右键菜单
- alter system set events相关知识(转帖1)