typedef 与指针zz
---------------------------------------------
指向数组的指针(叫做数组指针)
指向函数的指针,即函数指针
int *f(int ),f 函数,返回int 型的指针
int (*f)(),f 是指向int(int)的指针,f 是一个函数指针变量
:函数名是一个地址。
一个函数在编译时被分配一个入口地址,将这个入口地址称为函数的指针,可
---------------------------------------------------------------------
-----
typedef 似乎很简单,如typedef int integer;然而,这些简单的typedef 语
句容易让人产生一种误解,typedef 就是一种宏替换,把后面的自定义类型替换
成前面的已知类型,事实是这样的吗?显然不是!
考虑这样的问题:如何定义一个指向整型的指针类型?如何定义一个函数指
针类型?
第一个问题很简单:typedef int* int_pointer;即可,对于第二个问题,似
乎就没有那么简单了,首先,看函数指针的定义方法:int (*p)(const&, int);
这个p 指向的函数必须返回int,形参必须是const&和int。现在要将这种指针
类型命名为func_pointer,其定义的方法如下:
typedef int (*func_pointer)(const&, int);
可以这样来理解:typedef int integer;将typedef 去掉,那就是个变量的定
义,这儿即定义了一个int 型的变量integer,考虑这个integer 是什么类型的,
那么这个typedef 语句就是将integer 定义为这个类型的。将typedef int
(*func_pointer)(const&, int);中的typedef 去掉,就成了一个函数指针定义,
即func_pointer 被定义为函数指针类型变量,那么原来的typedef 即将
func_pointer 定义为函数指针类型。
----
typedef int (*func_pointer)(const&, int);
typedef 是一种存储类型的声明。
函数指针类型,是一种类型,int (*)(const&, int);就是函数指针类型,
func_pointer 是函数指针类型的变量,是一个变量的名字。
------
int (*testCases[10])();
这个表达式是什么意思?-------------函数指针数组
----
函数指针类型。int(*)()
变量名是testCases【10】,是一个函数指针类型的变量,----函数指针类型的
数组
指数组testCase,大小是10,其各个元素都是函数指针类型的。
等价于:
typedef 来简化这种定义:
typedef int (*PFV)();
PFV testCases[10];
===
数组指针(即指向数组的指针)的定义: int (*ptr)[3];
这个表达式定义了一个数组指针ptr,ptr 一次跨越一个由3 个int 型组成
的一维数组。发现其定义的方式与函数指针定义的方式很相似,只是把()换作
了[]。
-----
----
指针,数组,函数糅合在了一起问题变得复杂起来。它定义了数组,
testCases[10],数组中的元素是函数指针,函数指针的类型是int (*)();
怎么来理解这种定义呢?首先考虑数组的定义,数组的定义一般模式是:类
型数组名[大小];
考虑这个表达式,似乎是定义了一个数组,但是数组名[大小]被夹在了中间,那
么类型是什么呢,发现类型并不是简单的数据类型,而是一个函数指针类型int
(*p)(),这个函数没有参数,返回int 型。从而这个表达式的含义是:定义了一
个函数指针型的数组,大小是10。可以利用typedef 来简化这种定义:
typedef int (*PFV)();
PFV testCases[10];
其实int (*testCases[10])();这儿我们定义了一个函数指针数组,数组是主体。
下面考虑这样的问题:如何定义一个指向数组的指针(叫做数组指针)?
指向数组的指针,好像比较新鲜,所谓指向数组的指针,即指针的一步跨越
是一个数组,跟指向整型的指针一步跨越一个整型一个道理。事实上前面已经碰
到了指向数组的指针,如二维数组名,实际上就是一个指向数组的指针,它一次
跨越一行的数据,实际上即是跨越了一个一维数组,而三维数组名呢,也是一个
指向数组的指针,它一次跨越的是低维组成的一个二维数组。
数组指针(即指向数组的指针)的定义: int (*ptr)[3];
这个表达式定义了一个数组指针ptr,ptr 一次跨越一个由3 个int 型组成
的一维数组。发现其定义的方式与函数指针定义的方式很相似,只是把()换作
了[]。更进一步,如果要定义一个指向数组的指针,而数组中的元素不是简单的
int 型,而是比较复杂的类型,那该如何定义呢?事实上数组指针这种东西就已
经够稀有的了,一般编程绝对不会用到,我们只需要能读懂一些比较复杂的东西
就行了,自己没有必要构造这么复杂的类型。
比较复杂的表达式:
1、int (*(*(*p())[])())[];
首先,根据p()判断p 是一个函数,再根据p()前面的*号判断该函数返回一
个指针,下面就看这个指针指向的是什么类新了,我们可以把*p()替换成一个
*pointer,这个pointer 就是函数p 返回的指针,那么就成了int
(*(*(*pointer)[])())[];再根据(*pointer)[],这说明了指针pointer 是指向
的一个数组,那么这个数组中的元素是什么类型呢?由于数组名实际上就是个指
针,我们把(*pointer)[](即(*p())[])替换成一个array,这样就成了int
(*(*array)())[];发现array 是一个函数指针,从而数组中的每个元素是函数指
针,而这个函数呢,又返回一个指针类型,把(*array)()用func 代替,就成了
int (*func)[];这说明了func 函数返回的是指向数组的指针,数组中的元素是
int 型。
这个表达式够酷!!!
2、p = (int( * (*)[20])[10])q;
这是一个强制类型转换,q 被强制类型转换成一个这样的指针类型,这个指
针呢直线一个具有20 个元素的数组,这个数组中的元素也是指针,是指向另外
一种数组,这种数组是含有10 个int 型数据的一维数组。
可见,分析复杂的表达式时(所谓复杂,即糅合了指针,数组,函数三样,
缺少了一样就不会复杂了),从括号的最里层做起,最里层的东西是复杂表达式
的“根节点”,然后一层一层脱,脱的时候,是这样的,比如里层是个数组,那
么就是说这个数组的元素是什么呢,那就是外层的东西,如果里层是个有返回值
的函数,那么就是说这个函数返回什么值呢?那就是外层的东西,就这样一层一
层地把表达式解析清楚。
关于typedef 还有一些要说的:
typedef int (*PFV)(); 这是定义了一个函数指针,那么PFV p;就可以定义了
一个指向函数的指针。
typedef int (*p[10])(); 这是把p 定义为函数指针数组,那么p array;语句
就可以定义了一个函数指针数组,数组名即为array,array 这个数组含10 个元
素。
typedef int (*parray)[3];这是定义了一个指向整型数组的指针,那么parray
ptr;就定义了一个指向数组的指针。如何对这个ptr 赋值或者初始化呢?事实
上,是通过二维数组名来对其进行赋值(初始化)的,因为二维数组名作为指针
来讲,就是一个指向数组的指针,一次跨越一个数组。
typedef int a[3][3]; 这个语句什么意思呢?这是把a 定义为一个3*3 的整型
数组类型。当a b = {1}时就完成了一个3×3 的整型数组的定义初始化的工作。
同样,简单一点typedef int a[3];这个语句是把a 定义为一个一维数组类型。
typedef void func(int); 这个语句定义了一个函数类型。通过这个typedef,
我们可以比较清晰地定义出函数指针,func* p;即可。(p 是void(int)类
型指针)
typedef char* string;
const string str;
这个str 是什么类型的呢?const char * str,即指向常量的指针类型?事实上,
答案有些不可思议,str 是一个常量指针,而不是指针常量,即const 修饰符针
对的是指针(就是str,string 是一个指针类型,指向char 类型变量),而不
是char。
以用一个指针变量指向该函数指针,然后通过该变量来调用函数。
分享到:
相关推荐
于C++中函数指针的使用(包含对typedef用法的讨论)
理解复杂的CC++声明 const, typedef , 函数指针
c++typedef函数指针类型[文].pdf
单片机Keil C51中函数指针的使用,这个东西不错的,至少我觉得不错啊,
cpp代码-typedef 别名和函数指针别名
C语言中typedef的用法以及函数指针
收集了函数指针_extern_typedef_const_static的基本用法。 拿出来供大家共享
这篇文档介绍了c++中函数指针的如用方法,另外对typedef的用法进行介绍,希望对你能有帮助。。
typedef的用法 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,
typedef的四个用途和两个陷阱 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针........
C语言typedef定义类型精讲(超详细),typedef的常用使用方法:与结构体、数组、指针、函数指针、枚举的结合使用;使用typedef的优势:不仅可以让代码更加简洁,还可以增加代码的可移植性。使用typedef需要注意的一些...
typedef的用法 typedef 是 C 和 C++ 语言中的一个关键字,用于为数据类型定义一个新的名称。这可以使得代码更加简洁和可读。通过使用 typedef,我们可以为基本数据类型、结构体、联合体等定义别名,这样在后续的代码...
针对上述问题Qt提供⼀组类模板(Smart指针类)来管理C++中的裸指针, 同时提供相关重载运算符使得使⽤起来与指针操作⽆异。 指针的⽣ 命周期也交由Smart类来管理⽽不⽤程序员⾃⼰去⼿动管理。使⽤Smart指针进⽽避免了...
定义的类型不同,typedef定义的是类型,而#define不只是可以为...typedef虽执行范围有限,但在范围内比#define要更加灵活,例如在指针类型的定义上,typedef可以定义一个指针类型,而#define只能定义一个指针。 type
c语言函数指针的申请使用,有普通定义以及typedef定义
函数指针的使用,主要用到typedef,其实现功能跟模板类差不多
C语言中枚举与指针的实例详解 总结一下, 定义枚举,用typedef enum关键字, 比如 typedef enum{Red,Green,Blue} Color3; 枚举到数值的转换,如果没有指定代表数值就是从0开始算, 比如 Color3 c=Red; printf(“%d”...
c++中的函数指针介绍,c++入门知识,详细的介绍了函数指针的定义方法和用法
typedef与#define有些相似,其实是不同的,特别是在一些复杂的用法上,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,加上自己的一个分析。...