函数指针和指针函数以及typedef的用法

合集下载

CC++中typedef关键字详解

CC++中typedef关键字详解

CC++中typedef关键字详解typedef是C/C++中⼀个很关键的关键字,它的作⽤是⽤来给类型起别名。

因为在遇上不同数据类型,尤其是复杂类型,typedef的⽤法有⼀些细微的差距,所以很多⼈会有⼀些疑惑,今天我就来整理⼀下。

typedef关键字主要⽤来给⼀下⼏种类型起别名:基本数据类型结构体数组枚举类型指针函数指针指针函数1. 基本数据类型使⽤typedef给基本数据类型起别名很简单://typedef关键字数据类型别名typedef int Myint;typedef double Mydouble;起了别名以后,别名就相当于原类型名的同义词,能使⽤原类型的地⽅就可以使⽤别名。

2. 结构体和基本数据类型类似,将别名放在结构体之后struct Person{string name;int age;};//typedef关键字结构体别名typedef struct Person P;3. 数组给数组起别名时,typedef的⽤法和单个元素有些区别,别名被挤在数组元素类型和数组元素个数之间。

//typedef关键字数组元素类型别名[数组元素个数]typedef int C[10];C t; // t的类型是int[10],也就是包含10个int类型的数组4. 枚举类型和结构体类型类似enum Color{Red,Green,Blue} primaryColor;//typedef关键字枚举类型别名typedef Color primaryColor;primaryColor G = Red5. 指针//typedef关键字指针别名typedef char*String;String l = "name";对指针起别名需要注意的⼀点就是,如果要对别名加const关键字,必须要知道,我们声明的是⼀个常量指针,⽽不能将其按照字⾯上,理解为指向常量的指针。

typedef char*String;char*p = "hello";const String P = p;//P++; // 错误,P是常量指针,⽆法⾃增const char*S; // 如果将typedef的内容直接替换,很容易得到本⾏的结果,但这是错误的理解,它⼀个指向常量的指针S = p;S++; //S是指向常量字符的指针,可以⾃增6. 函数指针给函数指针起别名也和上⾯的⽅法类似//typedef关键字返回值类型别名参数类型typedef int(*Func)(int,int);Func Max; //Max是⼀个函数指针7.指针函数//typedef关键字返回值类型别名参数类型typedef int*Func2(int,int );Func2 Min;总结typedef关键字可以给多种数据类型赋值,如果每种情况都单独去记,可能也不太记得住,所以我在这⾥推荐⼀个⼩技巧:去掉typedef关键字,将原先的别名视为⼀个变量,这个变量是什么类型,那么这个别名就是这个类型的同义词。

函数指针和指针函数用法和区别

函数指针和指针函数用法和区别

函数指针和指针函数用法和区别函数指针和指针函数(pointerfunction)是C语言编程中常用的技术,在一些高级编程技术(例如设计模式)中也有广泛的应用。

它们的概念比较复杂,有时候会让初学者有点晕头,但是一旦理解了它们的用法和区别,大家就会发现它们对于结构化编程的设计有着重要的意义。

本文尝试以最简单的方式阐述函数指针和指针函数的用法和区别。

首先,在我们讨论函数指针和指针函数之前,我们最好以一个函数为例来介绍它们:void foo (int a, int b){int c = a + b;printf(%dc);}foo函数接收两个整数参数a和b,并将它们相加后输出结果。

接下来我们来看看函数指针是什么:函数指针(function pointer)是一种指向函数的指针,它可以把函数的地址保存在指针变量中,这样你就可以通过指针调用函数。

句话说,它实际上指向一个函数,通过调用它,你可以调用函数。

函数指针的声明可以形式如下:void (*fooPtr)(int, int);其中,fooPtr是函数指针变量,函数指针变量fooPtr可以指向函数foo()。

函数指针可以赋值,例如:fooPtr=foo;此外,你可以使用函数指针调用函数,例如:(*fooPtr)(1,2);这里,可以说fooPtr指向函数foo(),并且调用函数foo()。

现在,让我们来看看指针函数是什么:指针函数(pointer function)是一种特殊的函数,其返回值类型是指针,即它是一种不接受参数并返回指针的函数。

指针函数的声明可以形式如下:int *fooPtr(void);其中,fooPtr()是指针函数,它返回一个int类型的指针。

指针函数可以调用,例如:int *p = fooPtr();这里,fooPtr()调用了指针函数,并将返回的指针赋值给*p。

了解了函数指针和指针函数的基本概念及其用法后,那么函数指针和指针函数有什么区别?函数指针和指针函数的主要区别在于,函数指针可以指向任何函数,而指针函数必须返回指针类型的变量,并且不接受任何参数。

C语言typedef用法总结

C语言typedef用法总结

C语言typedef用法总结黄海涛,2012-3-11C语言中的typedef可以让人感觉很清新,但也可以让人感觉神秘。

当你一层层剥开它的时候,神秘的面纱终会摘下……让我们一起来探究其中的秘密吧!一、概述1、类型定义符typedefC语言提供了一个称为typedef的工具,它允许你为各种数据类型定义新的名字。

定义形式:typedef 原类型名新类型名;它的格式与变量声明完全一样,只是把typedef这个关键字放在声明的前面,但typedef并不创建变量,而是为指定类型引入一个新的名字。

2、实质其实质是:为现有类型取个新名字,它并没有引入新的类型。

typedef是一种声明形式,它为一种类型引入新的名字,而不是产生新的类型,也不会为变量分配空间。

3、作用时机在某些方面,typedef类似于宏文本替换,但typedef是类型定义符,在编译时会有相应类型的检查。

typedef是由编译器解释的。

▲typedef与#define的区别A.#define后面没有分号,而typedef后面有分号;B.#define不是关键字,而typedef是关键字;C.宏定义中宏名紧跟着#define,而typedef中的类型名并不紧接其后;D.可以用其他类型说明符对宏名进行扩展,但对typedef定义的类型名却不行;例如:E.在连续几个变量声明中,typedef定义的类型名可以保证声明中所有的变量均为同一种类型,而#define定义的宏名则无法保证。

4、使用原因1)表达方式更简洁,简化编程;2)使程序参数化,提高程序的可移植性;3)为程序提供更好的说明性,可以引入一个易记且意义明确的新名字,提升可维护性。

5、缺点允许一些看上去混乱的语法,可以把几个声明放在一个声明中。

如:二、使用typedef声明定义时的限制1、2、3、存储类关键字:auto、extern、register、static与typedef但在存储类说明符中,typedef是个例外,它不会真正影响对象的存储特性。

typedef c++的用法

typedef c++的用法

typedef c++的用法typedef是C++程序设计中的一种重要的语法,它的主要功能是为类型定义一个别名,主要用作数据类型的简写,可以使程序更易于理解和更简洁地表示类型。

具体来说,就是用一个typedef关键字把一种复杂的数据类型定义一个别名,在以后的程序中都可以使用它简化编写代码,提高程序可阅读性。

typedef type name;typedef的运用场景主要有以下几种:一、简写类型typedef可以用于简写程序中long、int、short等数据类型,可以添加前缀或后缀。

比如:typedef long Long;typedef int Int;typedef short Short;以上定义可以使用Long、Int、Short三种类型,以替代原来的long、int、short。

二、避免函数指针的混淆函数指针作为C++程序设计中一种重要技术,可以方便地进行函数调用,但是,函数指针的语法比较复杂,容易引起程序员的混淆。

使用typedef可以将函数指针类型名称的定义改为更加简洁的形式,大大降低使用它们的复杂度,让代码更加美观、易懂。

比如:typedef int (* Fun ) (int , int);定义一个函数指针类型名为Fun,指向一个参数分别为int型和int型,返回值为int型的函数。

以后可以用Fun类型来定义函数指针。

三、扩展代码的可移植性C++的基本类型在不同的操作系统和编译器上有不同的定义,如果在程序中直接使用系统定义的基本类型,会导致在移植过程中出现较大的麻烦,不得不反复编辑程序实现不同环境的基本类型定义。

通过使用typedef可以规范自定义的基本类型,将系统定义的基本类型定义为自己的别名,用自己的别名来统一管理、表示基本数据类型,从而可以大大提高程序的可移植性。

比如:四、定义枚举类型使用typedef也可以定义枚举类型,可以避免大量的枚举类型定义可能对代码可读性的影响。

qt中typedef的用法 -回复

qt中typedef的用法 -回复

qt中typedef的用法-回复typedef是C++中的一个关键字,用于给已有的数据类型或自定义的数据类型起一个新的名称。

通过使用typedef,可以方便地定义复杂的数据类型,并使代码更加易读和可维护。

本文将一步一步回答有关typedef在Qt中的使用的问题。

首先,让我们了解typedef的基本语法。

在C++中,使用typedef时需要先指定要定义的类型,然后使用关键字typedef给该类型起一个新的名称。

typedef的基本语法如下所示:typedef type new_name;其中,type是现有的数据类型,比如int、float、char等,或者是自定义的数据类型,比如结构体、枚举或类。

new_name是我们为该类型起的新名称。

在Qt中,我们通常使用typedef来定义复杂的数据类型,比如指针类型、函数指针类型和函数类型等。

下面,我们将通过几个例子来详细说明typedef在Qt中的用法。

1. typedef指针类型在Qt中,经常需要使用指针类型来操作动态分配的内存或者使用动态数组。

typedef可以方便地定义指针类型的新名称,使代码更易读。

例如,我们可以使用typedef定义一个指向int类型的指针类型,如下所示:typedef int* IntPtr;现在,我们可以使用IntPtr作为指向int类型的指针的新名称。

例如,我们可以声明一个使用IntPtr类型的指针变量,如下所示:IntPtr pInt;这等效于以下声明:int* pInt;2. typedef函数指针类型在Qt中,通过函数指针可以动态调用不同的函数。

typedef可以用于定义函数指针类型的新名称,使函数指针的声明更加清晰和简洁。

例如,我们可以使用typedef定义一个指向函数的指针类型,如下所示:typedef void (*FunctionPtr)(int);现在,我们可以使用FunctionPtr作为指向参数为int、返回类型为void 的函数指针的新名称。

typedef在c++中的用法

typedef在c++中的用法

typedef在c++中的用法
typedef是C++中的一种类型定义关键字,它可以为一个已有的数据类型定义一个新的名称,使得使用该数据类型时更加方便简洁。

typedef通常用于定义复杂的数据类型,如结构体、枚举、函数指针等。

typedef的基本语法格式为:typedef 被定义的数据类型新名称;
例如,我们可以使用typedef定义一个结构体类型:
typedef struct
{
int age;
char name[20];
} Person;
在这个例子中,我们将结构体类型定义为Person,使用起来就可以像下面这样:
Person p;
p.age = 20;
strcpy(, 'Tom');
除此之外,typedef还可以用于定义函数指针类型,例如:
typedef void (*FunPtr)(int, int);
在这个例子中,我们将一个函数指针类型定义为FunPtr,这个函数指针可以接受两个整型参数,并返回空。

使用起来就可以像下面
这样:
void MyFunc(int a, int b)
{
// do something
}
FunPtr fp = MyFunc;
fp(1, 2);
通过typedef定义自己的类型可以使代码更加简洁易懂,使得代码维护更加容易。

但是需要注意的是,过度使用typedef可能会影响代码的可读性,因此应该谨慎使用。

typedef函数用法

typedef函数用法

typedef函数用法`typedef` 是 C 和 C++ 语言中的一个关键字,用于为数据类型定义新的名称。

这在简化复杂的类型声明或为类型定义易于记忆的名称时非常有用。

以下是一些 `typedef` 的基本用法:1. 为基本数据类型定义别名:```ctypedef int Integer; // Integer 是 int 的别名```2. 为指针类型定义别名:```ctypedef int IntegerPtr; // IntegerPtr 是 int 的别名```3. 为结构体定义别名:```ctypedef struct {int x;int y;} Point; // Point 是该结构体的别名```4. 为函数指针定义别名:```ctypedef void (func_ptr)(int); // func_ptr 是函数指针的别名,该函数接受一个 int 参数并返回 void```5. 在函数定义中使用 `typedef`:当你需要在函数返回类型中定义一个新的类型时,可以在函数定义中直接使用 `typedef`。

```ctypedef struct {int x;int y;} Point;Point getOrigin() { // getOrigin() 返回一个 Point 类型的结构体Point p;= 0;= 0;return p;}```6. 简化复杂类型声明:例如,当你在处理函数指针时,使用 `typedef` 可以使代码更易读。

7. 与其他关键字结合使用:例如,你可以与 `const` 关键字结合使用,以定义一个常量整数类型。

8. 在类中使用:在 C++ 中,你也可以在类中使用 `typedef` 来定义成员函数的类型或类的属性。

9. 为数组定义别名:虽然数组名本质上是一个指向数组第一个元素的指针,但你可以使用 `typedef` 为数组定义一个别名。

10. 与其他语言交互:当你需要与使用其他语言(如 C 或 Java)编写的代码进行交互时,使用`typedef` 可以帮助你更好地理解那些语言的类型系统。

typedef函数指针的定义和使用方法说明

typedef函数指针的定义和使用方法说明

2、 typedef 用法
2.1 用法一:给函数定义别名 typedef (int) (*FunName) (int, int) 这种用法一般在给函数定义别名的时候用到,上面的例子中 FunName 是一个函数指 针,函数本身带两个 int 参数,返回一个 int。 分析上述定义时,可以去掉 typedef 和别名,剩下的部分就是原变量的类型。如: typedef (int) (*FunName) (int, int) 去掉 typedef 和别名后剩下: (int) (*) (int, int) 说明 FunName 是一个函数指针。 2.2 用法二:给数据类型定义别名 typedef struct { int VaribleA; int VaribleB; }NewTypeName; 上述例子中,通过 typedef 定义了一个新的类型别名 NewTypedef。在定义别名后,
Calculation GetFunctionAddr(char option) //获取对应运算的函数地址 { switch(option) { case 1: return(AddCalc); case 2: return(SubCalc); default: return(NULL); } } main() { int Varible1 = 1; int Varible2 = 2; //定义函数指针,存放函数地址 Calculation fp = GetFunctionAddr(1);
可以通过以下的步骤优化: //定义每一个 case 对应的处理函数 void HandleCase1(void) { 功能 1; } ….. void HandleCase100(void) { 功能 100; } typedef (void)(*HandleCaseFcn)(void); HandleCaseFcn FcnName[]

C语言中Typedef的使用方法

C语言中Typedef的使用方法

C语言中Typedef的使用方法3李 钢,黄湘萍,许 焰(长沙大学机电工程系,湖南长沙 410003)摘 要:在C语言中,除可以直接使用标准类型名(如int、char、float、double等)和自定义的结构体、共用体、指针、枚举类型外,还可以用Typedef定义新的类型名来代替已有的类型名1如果能熟练使用Ty2 pedef,将有利于建立与平台无关的数据类型,甚至能隐藏一些复杂和难以理解的语法,避免一些常见的错误,从而使C程序代码更灵活1关键词:变量;数据类型;结构体;指针中图分类号:TP312 文献标识码:A 文章编号:100824681(2007)0920070204 typedef声明,简称typedef,为现有的数据类型创建一个新的名字1用typedef定义新的类型名后,对于结构体、共用体或枚举类型,使用它们定义或说明变量时,不必再冠以类型类别关键字,一般常使用typedef来编写更为美观和可读性较强的代码.所谓美观,即指typedef能隐藏较笨拙的语法构造以及平台相关的数据类型,从而增强程序的可移植性、以及将来的可维护性1本文将揭示typedef 强大功能11 C语言中typedef基本用法[1,2,3]typedef为C语言的关键字,作用是为一种数据类型定义一个新名字1这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(st ruct 等)1在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明11.1 typedef的最简单使用typedef int integer;给已知数据类型int定义为integer,这样,以下两行代码是等价的:int a,b;integ a,b;1.2 typedef与结构结合使用typedef st ruct tagMyStruct {int iNum; long lLengt h; }MySt ruct;这组语句实际上完成两个操作:1.2.1 定义一个新的结构类型st ruct tagMySt ruct {int iNum; long lLengt h;};1.2.2 typedef为这个新的结构起了一个名字,叫MySt ructtypedef st ruct tagMySt ruct MyStruct;分析:tagMySt ruct称为“tag”,即“标签”,实际上是一个临时名字,关键字st ruct和tagMySt ruct 一起,构成了这个结构类型,不论是否有typedef,这个结构都存在1可以用st ruct tagMySt ruct varName来定义变量,但要注意,使用tagMySt ruct varName来定义变量是不对的,因为st ruct和tagMySt ruct合在一起才能表示一个结构类型1因此,MyStruct实际上相当于st ruct tagMy2 St ruct,可以使用MySt ruct varName来定义变量11.3 typedef可定义指针、数组、枚举等类型typedef还可以定义指针、数组、枚举类型等数据类型,如:(1)typedef int num[100];//声明num为整型数组类型num n;//定义n为整型数组变量(2)typedef char3st ring;//声明st ring为字符指针类型3收稿日期:2007205222;修回日期:2007206219作者简介:李 钢(1965-)男,湖南长沙人,长沙大学机电工程系实验师1研究方向:计算机网络与计算机管理.st ring p,s[10];//定义p为字符指针变量,s为指针数组(3)typedef int(3pointer)()//声明pointer为指向函数的指针类型,该函数返回整型值pointer p1,p2;//定义p1、p2为pointer类型的指针变量(4)typedef enum{sun,mon,t ues,wed,t hur,f ri sat}days;//声明days为枚举类型days today;//定义today为days类型的变量2 typedef和结构的问题至于typedef到底有什么微妙之处,可以从下面的几个问题得到答案1当用下面的代码定义一个结构时,编译器会报类型错误1typedef st ruct tagNode {char3p Item; pNode pNext; }3p Node;C语言允许在结构中包含指向它自己的指针,这可以从建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用1根据前面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字不存在,也就是说这个时候编译器根本不能识别pNode1解决这个问题的方法下列3种:(1)常用方法有两种:①typedef struct tagNode{char3p Item; st ruct tagNode3pNext;}3pNode;②typedef struct tagNode3pNode;st ruct tagNode{char3p Item; p Node p Next;};注意:这个例子中,typedef给一个还未完全声明的类型起新名字1C语言编译器支持这种做法1(2)规范做法:st ruct tagNode{char3p Item; st ruct tagNode3pNext;};typedef st ruct tagNode3pNode;3 typedef和#def ine的问题[1,2]有下面两种定义p St r数据类型的方法,两者有什么不同?哪一种更好一点?typedef char3p St r;#define p Str char3;通常,typedef要比#define要好,特别是在有指针的场合1typedef char3p St r1;#define p Str2char3;p St r1s1,s2;p St r2s3,s4;在上述的变量定义中,s1、s2、s3都被定义为char3,而s4则定义成了char,不是所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字1#define用法例子:#define f(x)x3xmain() {int a=6,b=2,c; c=f(a)/f(b); p rintf("%d\n",c); }程序的输出结果是:361因此,在C语言编程规范中,使用#define定义时,如果定义中包含表达式,必须使用括号,则上述定义应该如下定义才对:#define f(x)(x3x)如果使用typedef就没有这样的问题出现1typedef和#define的另一例下面的代码在编译器中也会出问题:typedef char3p St r;char st ring[4]="abc";co nst char3p1=st ring;co nst p St r p2=st ring;p1++;p2++;是p2++出错了1这个问题再一次说明:ty2 pedef和#define不同,它不是简单的文本替换1上述代码中const p St r p2并不等于const char3 p21const p St r p2和const long x本质上没有区别,都是对变量进行只读限制,只是此处的变量p2数据17 总第79期 李 钢,黄湘萍,许 焰 C语言中Typedef的使用方法类型是自定义的而不是系统固有类型1因此,co nst p St r p2的含义是:限定数据类型为char3的变量p2为只读,因此p2++错误1#define与typedef的区别:(1)#define宏定义有一个特别的长处:可以使用#if def,#if ndef等来进行逻辑判断,还可以使用#undef来取消定义1(2)typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性1这里有两点值得注意:(1)用typedef只是给已有类型增加1个别名,并不能创造1个新的类型1(2)typedef与#define有相似之处,但二者是不同的:前者是由编译器在编译时处理的;后者是由编译预处理器在编译预处理时处理的,而且只能作简单的字符串替换14 typedef复杂的变量声明在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:下面是三个变量的声明,如想使用typdef分别给它们定义一个别名,该如何做?(1)int3(3a[5])(int,char3);(2)void(3b[10])(void(3)());(3)doube(3)()(3pa)[9];对复杂变量建立一个类型别名的方法很简单,只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了1(1)int3(3a[5])(int,char3);//p Fun是新建的一个类型别名typedef int3(3p Fun)(int,char3);//使用定义的新类型来声明对象,等价于int3 (3a[5])(int,char3);p Fun a[5];(2)void(3b[10])(void(3)());//首先为void(3)声明一个新类型typedef void(3p FunParam)();//整体声明一个新类型typedef void(3p Fun)(p FunParam);//使用定义的新类型来声明对象,等价于void (3b[10])(void(3)());p Fun b[10];(3)doube(3)()(3pa)[9];//首先为doube(3)()声明一个新类型typedef double(3p Fun)();//整体声明一个新类型typedef p Fun(3p FunParam)[9];//使用定义的新类型来声明对象,等价于doube(3)()(3pa)[9];p FunParam pa;5 创建平台无关的数据类型,隐藏笨拙且难以理解的语法 使用typedef s为现有类型创建同义字1定义易于记忆的类型名typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图1类型出现在所声明的变量名字中,位于“typedef”关键字右边1例如:typedef int size;此声明定义了一个int的同义字,名字为size1注意typedef并不创建新的类型1它仅仅为现有类型添加一个同义字1可以在任何需要int的上下文中使用size:void measure(size3p sz);size array[4];size len=file.getlengt h();st d::vector vs;typedef还可以掩饰符合类型,如指针和数组1不用象下面这样重复定义有81个字符元素的数组: char line[81];char text[81];定义一个typedef,每当要用到相同类型和大小的数组时,可以这样:typedef char Line[81];Line text,secondline;getline(text);同样,也可以象下面这样隐藏指针语法:typedef char3p st r;int myst rcmp(p str,p st r);这里将带来个typedef的一个误区1标准函数strcmp()有两个‘const char3’类型的参数1因此,有可能会误导用象下面这种方式声明mystrcmp ():int myst rcmp(const p st r,const p st r);这种方式是错误的,按照顺序,‘const p st r’被解27长沙大学学报 2007年9月 释为‘char3const’(一个指向char的常量指针),而不是‘const char3’(指向常量char的指针)1正确解决这个问题的方法是:typedef const char3cp st r;int myst rcmp(cp st r,cp str);只要为指针声明typedef,那么都要在最终的typedef名称中加一个const,以使得该指针本身是常量,而不是对象16 代码简化上面讨论的typedef行为有点像#define宏,用其实际类型替代同义字1不同点是typedef在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换1例如:typedef int(3PF)(const char3,const char 3);这个声明引入了PF类型作为函数指针的同义字,该函数有两个const char3类型的参数以及一个int类型的返回值1如果要使用下列形式的函数声明,那么上述这个typedef是不可或缺的: PF Register(PF pf);Register()的参数是一个PF类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同1如果不用typedef,将如何实现这个声明的: int(3Register(int(3pf)(const char3, const char3)))(const char3,const char3);很难理解这是什么意思,更不用说这种费解的代码会带来什么风险1在这里使用typedef是一种必需17 促进跨平台开发typedef还有另一个重要的用途,那就是定义与机器无关的类型1如可以定义一个叫REAL的浮点类型,在目标机器上它可以获得最高的精度:typedef long double REAL;在不支持long double的机器上,该typedef看起来会是下面这样:typedef double REAL;并且,在连double都不支持的机器上,该ty2 pedef看起来会是这样:typedef float REAL;不用对源代码做任何修改便可以在每一种平台上编译这个使用REAL类型的应用程序1唯一需要改的是typedef函数本身1在大多数情况下,这个微小的变动完全都可以通过编译来自动实现18 小结Typedef声明符的使用使得C语言程序在可移植性、简洁性方面有较大提高,极详细分析了常见的Ⅷ种使用方法及其使用后在程序改进方面的变化,由此可以看出typedef声明符的强大功能,事实上typedef应该还有更多的应用有待进一步挖掘,灵活运用typedef会对C语言编写带来更多的好处1参考文献:[1]杨路明.C语言程序设计教程[M].北京:北京邮电大学出版社,2005.[2]谭浩强.C程序设计[M].北京:清华大学出版社,1991.[3]潘金贵,沈默君,谢俊元,等.TORBO语言及其程序设计[M].南京:南京大学出版社,1988.(作者本人校对)37 总第79期 李 钢,黄湘萍,许 焰 C语言中Typedef的使用方法。

c++的typedef的用法

c++的typedef的用法

C++中typedef关键字的用法本文介绍了C++中typedef的用法和作用。

typedef是一种用来创建类型别名的关键字,它可以为一个已有的数据类型定义一个新的名称,以方便程序员使用。

typedef有以下几种用途:定义类型别名,提高代码的可读性和一致性。

定义与平台无关的数据类型,实现跨平台的编程。

定义复杂的声明,简化代码的编写和理解。

定义函数指针,方便函数作为参数或返回值传递。

一、typedef的基本语法typedef的语法如下:typedef type new_type_name;其中,type是已有的数据类型,new_type_name是我们为该类型定义的新名称。

例如:typedef int INT; //定义INT为int类型的别名typedef char* PSTR; //定义PSTR为char*类型的别名使用typedef定义的新类型名可以像原类型名一样使用,例如:INT a = 10; //相当于int a = 10;PSTR s = "Hello"; //相当于char* s = "Hello";注意,typedef并不会创建新的数据类型,只是为已有的数据类型起一个新名字。

因此,使用typedef定义的新类型名和原类型名是完全等价的,可以互相赋值或比较。

例如:int b = a; //合法PSTR t = s; //合法if (a == b) //合法if (s == t) //合法二、typedef的用途2.1 定义类型别名使用typedef为一个已有的数据类型定义一个新名称,可以提高代码的可读性和一致性。

例如,在C语言中,经常需要使用指针来操作字符串或数组。

如果直接使用char或int等类型来声明指针变量,可能会出现以下问题:代码不够直观和清晰,容易出错或混淆。

例如:char* p1, p2; //p1是指针变量,p2是字符变量char *p1, *p2; //p1和p2都是指针变量代码不够一致和规范,容易造成风格不统一或误解。

c++typedef的用法结构体

c++typedef的用法结构体

c++typedef的用法结构体结构体是C++中非常重要的数据类型,它可以将不同类型的数据组合在一起,形成一个新的数据类型。

在实际编程中,我们经常需要定义结构体来表示复杂的数据结构。

而在使用结构体时,我们可以通过typedef关键字来给结构体起一个别名,以方便我们在代码中使用。

1. typedef的基本用法在C++中,我们可以使用typedef关键字为已有的数据类型、指针、数组、函数或结构体等起一个别名,从而方便我们在代码中使用。

我们可以通过以下方式来定义一个结构体和给它起一个别名:```cpptypedef struct {int id;string name;int age;} Person;```在这里,我们使用typedef关键字为一个包含id、name和age三个成员变量的结构体起了一个别名Person。

这样,我们在代码中就可以直接使用Person来表示这个结构体,而不需要再写出完整的定义。

2. 结构体的嵌套使用在实际编程中,我们经常需要使用结构体的嵌套,即在一个结构体中包含另一个结构体作为成员变量。

通过typedef的方式,我们可以方便地使用嵌套结构体,使得代码更加清晰易读。

我们可以定义一个包含多个学生信息的结构体,并给它起一个别名:```cpptypedef struct {int id;string name;int age;} Student;typedef struct {int classId;string className;Student students[50];} ClassInfo;```在这个例子中,我们定义了一个名为Student的结构体和一个名为ClassInfo的结构体,并且在ClassInfo结构体中包含了一个Student类型的数组作为成员变量。

这样,通过typedef的方式,我们可以在代码中直接使用Student和ClassInfo来表示这两个结构体类型。

C语言typedef的使用

C语言typedef的使用

C语言typedef的使用C语言typedef的使用typedef 关键字能帮助你简化复杂的定义并让你的代码简洁可靠,当然,可靠这一点我还是持保留态度,因人而异吧。

具体是如何使用呢?以下仅供参考!具体方法如下:C 语言提供typedef 关键字,允许你为已经存在的类型起一个新的名字,有一点需要注意,typedef 仅仅是为已经存在的类型创建了一个新的名字而已,不是创建新的类型。

首先将typedef 关键字放在前面,接着是已经存在的类型名,接着是新的名字:typedef existing_type new_name;举个例子,如果你想为unsinged integer 创建一个新的名叫score 的类型,你仅需要使用这样使用 typedef :typedef unsigned int score;后面你就可以使用“新类型” score 来声明变量,例如:score high_score;当然你还可以同时定义多个变量typedef int aaa, bbb, ccc;typedef int ar[15], arr[9][6];typedef char c, *cp, carr[100];/* 下面定义一些对象 *//* 都是int */aaa int1;bbb int2;ccc int3;ar yyy; /* 容量为15的整型数组 */arr xxx; /* 9*6 阶的整型数组 */c ch; /* 一个字符 */cp pnt; /* 指向字符的指针 */carr chry; /* 容量为100的字符数组 */C 语言 typedef 的使用这里来看一下使用typedef的好处,假如有一天你想将 unsigned int 修改成更大的数据类型,比如unsigned long,而此时你的很多代码文件都使用了unsigned int,如果没有使用typedef,你得到处都修改一遍,十分麻烦。

如果使用了之前的定义,这时只需修改score 一处就行,是不是很方便?另一个使用typedef 来增强可靠性的例子是size_t,size_t 是sizeof 操作符指定类型的大小,其基于目标处理器的运算能力而不是内存能力。

函数指针typedef 模板

函数指针typedef 模板

函数指针typedef 模板1. 函数指针typedef的定义函数指针typedef可以理解为为函数指针类型起一个别名。

在C语言中,函数指针指向一个函数的位置区域,可以通过该指针调用相应的函数。

使用typedef可以使得函数指针类型的声明更加简洁、易读。

2. 函数指针typedef的语法在C语言中,函数指针typedef的语法如下所示:```ctypedef 返回类型 (*指针名称)(参数列表);```其中,返回类型表示指向函数的返回值类型,指针名称为函数指针的别名,参数列表表示函数的形参列表。

3. 函数指针typedef的使用函数指针typedef可以通过以下几个步骤来定义和使用:(1) 定义一个函数指针类型的typedef,指定返回类型和参数列表。

```ctypedef int (*FuncPtr)(int, int);```(2) 使用typedef定义的函数指针类型来声明函数指针变量。

```cFuncPtr ptr; // 声明一个名为ptr的函数指针变量```(3) 将函数的位置区域赋给函数指针变量,并通过该指针调用函数。

```cint add(int a, int b) {return a + b;}ptr = add; // 将add函数的位置区域赋给ptrint result = ptr(3, 5); // 通过ptr调用add函数,得到结果8```4. 函数指针typedef的优点使用函数指针typedef的好处在于可以提高代码的可读性和可维护性。

通过为函数指针类型起一个别名,可以使得函数指针的声明和使用变得更加清晰明了,减少了代码中函数指针类型的重复出现,同时也提高了代码的可维护性。

5. 函数指针typedef的应用场景函数指针typedef广泛应用于各种复杂的系统和框架中,特别适用于回调函数的定义和使用。

回调函数通常作为参数传递给其他函数,通过函数指针回调来实现特定的功能。

typedef 用法

typedef 用法

typedef 用法typedef是C语言中的一个关键字,用于定义别名。

通常,我们使用typedef为数据类型或复杂结构体定义一个短而易懂的别名,以方便我们在程序中的使用。

具体来说,typedef可以用来定义以下几个东西:1. typedef基本数据类型别名例如,我们可以使用typedef为int定义一个别名myint,如下所示:```typedef int myint;```这样,在程序中我们就可以使用myint代替int类型了,例如: ```myint num = 10;```2. typedef复杂数据类型别名我们可以使用typedef为结构体、联合体、指针等复杂数据类型定义别名,例如:```typedef struct {int id;char name[20];float score;} Student;```这样,我们就定义了一个名为Student的结构体类型,包含三个成员变量id、name和score,我们可以使用Student作为结构体类型的别名,例如:```Student s1;```3. typedef函数指针别名我们可以使用typedef为函数指针定义别名,例如:```typedef int (*FuncPtr)(int, int);```这样,我们就定义了一个名为FuncPtr的函数指针类型,该函数指针的参数为两个int型变量,返回值也是int型变量,我们可以使用FuncPtr作为函数指针的别名,例如:```int add(int a, int b){return a + b;}FuncPtr ptr = add;int result = ptr(1, 2);```在上面的例子中,我们定义了一个名为add的函数,接着使用FuncPtr作为函数指针类型的别名,将add函数的地址赋给了指针变量ptr,最后通过ptr来调用函数。

综上所述,typedef是C语言中非常实用的一个关键字,可以帮助我们简化程序中数据类型的定义,提高代码的可读性和可维护性。

函数指针和typedef用法

函数指针和typedef用法

int (*func)(int *p);
首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。
14 printf("%p\n", add); /* 输出add的值 */
15 printf("%p\n", &add); /* 输出add的地址 */
16 printf("%p\n", fp); /* 输出fp的值 */
// 和一个字符变量;
以下则可行:
typedef char* PCHAR;
PCHAR pa, pb;
用途二:
用在旧的C代码中,帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名对象名,如:
二十一天学通C语言:函数型指针
本文节选自《21天学通C语言》一书
C程序中的函数也都是存放在代码区内的,它们同样也是有地址的。那么如何取得函数的地址呢?在前面也说过函数定义的时候实际上是定义了一个函数变量,那么是否可以将函数变量赋值给其他变量呢?回答这些问题需要涉及另外一个概念:函数型指针。按照已有的指针的知识,顾名思义,函数型指针就是指向函数的指针。如果有一个函数声明为:
【范例14-7】使用函数型指针来调用函数,实现方法如示例代码14-7所示。
示例代码14-7
01 #include <stdio.h>
02
03 int add(const int a, const int b) { /* 定义add函数 */

使用typedef定义函数类型和函数指针

使用typedef定义函数类型和函数指针
代码简化,促进跨平台开发的目的. typedef行为有点像#define宏,用其实际类型替代同义字。 不同点:typeቤተ መጻሕፍቲ ባይዱef在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。 用法一:
typedefint(MYFUN)(int,int);这种用法一般用在给函数定义别名的时候上面的例子定义MYFUN是一个函数指针,函数类型是带两个int参数,返回一个 int在分析这种形式的定义的时候可以用下面的方法:先去掉typedef和别名,剩下的就是原变量的类型.去掉typedef和MYFUN以后就剩:int()(int,int) 用法二:
? =>"typedefdoubleMYDOUBLE"中MYDOUBLE是类型double的一个typedef-name。 ? MYDOUBLE???d;<=>d是一个double类型的变量 ? [例2] ? typedefdoubleDp;? ? 分析: ? 去掉typedef?,得到正常变量声明=>doubleDp; ? 变量Dp的类型为double,即pointertodouble; ? =>"typedefdoubleDp"中Dp是类型double的一个typedef-name。 ? Dp???dptr;<=>dptr是一个pointertodouble的变量 ? [例3] ? typedefintFunc(int); ? 分析: ? 去掉typedef?,得到正常变量声明=>intFunc(int); ? 变量Func的类型为一个函数标识符,该函数返回值类型为int,参数类型为int; ? =>"typedefintFunc(int)"中Func是函数类型(函数返回值类型为int,参数类型为int)的一个typedef-name。 ? Func???fptr;<=>fptr是一个pointertofunctionwithoneintparameter,returningapointertoint ? Func????f;??这样的声明意义就不大了。 ? [例4] ? typedefint(PFunc)(int); ? 分析: ? 去掉typedef?,得到正常变量声明=>int(PFunc)(int); ? 变量PFunc的类型为一个函数指针,指向的返回值类型为int,参数类型为int的函数原型; ?

c语言中typedef的用法

c语言中typedef的用法

c 语言中typedef 的用法
C 语言是一门通用计算机编程语言,应用广泛。

C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C 语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C 语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

二十世纪八十年代,为了避免各开发厂商用的C 语言语法产生差异,由美国国家标准局为C 语言订定了一套完整的国际标准语法,称为ANSI C,作为C 语言最初的标准。

typedef 是在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异。

它本身是一种存储类的关键字,与auto、extern、mutable、staTIc、register 等关键字不能出现在同一个表达式中。

c 语言中typedef 的用法。

C语言指针函数和函数指针详解

C语言指针函数和函数指针详解

C语言指针函数和函数指针详解C语言指针函数和函数指针详解往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂。

以下是店铺为大家带来的C语言指针函数和函数指针详解,希望能帮助到大家!一、指针函数当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。

格式:类型说明符 * 函数名(参数)当然了,由于返回的是一个地址,所以类型说明符一般都是int。

例如:int *GetDate();int * aaa(int,int);函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。

int * GetDate(int wk,int dy);main(){int wk,dy;do{printf("Enter week(1-5)day(1-7) ");scanf("%d%d",&wk,&dy);}while(wk<1||wk>5||dy<1||dy>7);printf("%d ",*GetDate(wk,dy));}int * GetDate(int wk,int dy){static int calendar[5][7]={{1,2,3,4,5,6,7},{8,9,10,11,12,13,14},{15,16,17,18,19,20,21},{22,23,24,25,26,27,28},{29,30,31,-1}};return &calendar[wk-1][dy-1];}程序应该是很好理解的,子函数返回的是数组某元素的地址。

输出的是这个地址里的值。

二、函数指针指向函数的指针包含了函数的地址,可以通过它来调用函数。

声明格式如下:类型说明符 (*函数名)(参数)其实这里不能称为函数名,应该叫做指针的变量名。

这个特殊的指针指向一个返回整型值的函数。

指针的声明笔削和它指向函数的声明保持一致。

C中typedef函数指针的使用

C中typedef函数指针的使用

C中typedef函数指针的使⽤类型定义的语法可以归结为⼀句话:只要在变量定义前⾯加上typedef,就成了类型定义。

这⼉的原本应该是变量的东西,就成为了类型。

int integer; //整型变量int *pointer; //整型指针变量int array [5]; //整型数组变量int *p_array [5]; //整型指针的数组的变量int (*array_pointer) [5];//整型数组的指针的变量int function (int param);//函数定义,也可将函数名看作函数的变量int *function (int param);//仍然是函数,但返回值是整型指针int (*function) (int param);//现在就是指向函数的指针了若要定义相应类型,即为类型来起名字,就是下⾯的形式:typedef int integer_t; //整型类型typedef int *pointer_t; //整型指针类型typedef int array_t [5]; //整型数组类型typedef int *p_array_t [5]; //整型指针的数组的类型typedef int (*array_pointer_t) [5]; //整型数组的指针的类型typedef int function_t (int param); //函数类型typedef int *function_t (int param); //函数类型typedef int (*function_t) (int param); //指向函数的指针的类型注意:上⾯的函数类型在C中可能会出错,因为C中并没有函数类型,它的函数变量会⾃动退化成函数指针;在C++中好像是可以的。

在这⾥主要说明的是形式上的相似性.typedef的⼀般形式为:typedef 类型定义名;注意:上述⼀般形式中最后的分号不可缺少!在编程中使⽤typedef⽬的⼀般有两个,⼀个是给变量⼀个易记且意义明确的新名字,另⼀个是简化⼀些⽐较复杂的类型声明。

typedef函数指针

typedef函数指针

typedef函数指针typedef函数指针,又称为类型定义函数指针,它是指向函数的指针,是一种数据类型,它可以定义一个名称,用于存储指向特定函数的指针。

由于函数指针本身也是变量,因此可以存储在另一个指针中或者作为普通变量使用。

函数指针与普通变量不同,其存储的是函数的地址而不是函数本身,因此函数指针可以被用来实现函数指针数组,实现函数的指针传参,还可以用于回调函数等应用场合。

typedef函数指针是用typedef关键字定义的,其语法如下:typedef回类型 (*函数指针名称)(参数列表)typedef函数指针可以指向任何函数,它的定义与普通函数的声明类似,只是在函数的前面加上一个星号。

下面是一个简单的例子: // 一个函数指针typedef int (*func_ptr)(int, int);//义一个函数int add(int a, int b){return a + b;}// 使用定义的函数指针func_ptr fp;fp = &add;int result = fp(2, 3); //用add函数typedef可以用来定义指向函数的指针,但是它不能用来定义函数本身,也不能修改函数的参数列表,也不能改变函数的返回类型。

函数指针的应用有很多,其中最重要的是实现函数指针数组和函数指针传参。

函数指针数组的应用有很多,它可以用来存储可供不同对象调用的函数,还可以实现不同类型的选择结构,例如switch-case 语句。

函数指针传参则可以用来传递不同类型的函数给调用者,例如使用排序算法时可以传递基于数值大小判断的函数指针。

函数指针还可以用于回调函数,在C/C++中,回调函数是一种可以在特定时钟运行的函数,它可以被调用并提供参数。

回调函数一般用作插件函数,回调函数的使用有助于实现解耦,将用户的代码与框架的代码分离开。

函数指针也可以用来实现函数重载,函数重载可以帮助我们改善代码可读性,它可以让我们使用同一函数名分别实现不同参数类型的功能,但是由于C/C++不支持函数重载,我们可以使用typedef函数指针来实现函数重载同样的功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明笔削和它指向函数的声明保持一致。
指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
例如:
void (*fptr)();
EditFunc
主要的区别是一个是指针变量,一个是函数。在使用是必要要搞清楚才能正确使用
二、指针的指针
指针的指针看上去有些令人费解。它们的声明有两个星号。例如:
char ** cp;
如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针,依次类推。当你熟悉了简单的例子以后,就可以应付复杂的情况了。当然,实际程序中,一般也只用到 二级指针,三个星号不常见,更别说四个星号了。
例如语句 typedef int*apple; 理解它的正确步骤是这样的:先别看typedef,就剩下int*apple; 这个语句再简单不过,就是声明了一个指向整型变量的指针apple (注意:定义只是一种特殊的声明),加上typedef之后就解释成声明了一种指向整型变量指针的类型apple 。
{
static int calendar[5][7]=
{
{1,2,3,4,5,6,7},
{8,9,10,11,12,13,14},
{15,16,17,18,19,20,21},
p = fun(a);
注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
来讲详细一些吧!请看下面
指针函数:
当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。
{22,23,24,25,26,27,28},
{29,30,31,-1}
};
return &calendar[wk-1][dy-1];
}
程序应该是很好理解的,子函数返回的是数组某元素的地址。输出的是这个地址里的值。
char c1=**cp;
你可能想知道这样的结构有什么用。利用指针的指针可以允许被调用函数修改局部指针变量和处理指针数组。
void FindCredit(int **);
main()
{
int vals[]={7,6,5,-4,3,2,1,0};
把函数的地址赋值给函数指针,可以采用下面两种形式:
fptr=&Function;
fptr=Function;
取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
可以采用如下两种方式来通过指针调用函数:
scanf(%d%d,&wk,&dy);
}
while(wk<1||wk>5||dy<1||dy>7);
printf(%d\n,*GetDate(wk,dy));
}
int * GetDate(int wk,int dy)
}
先用字符型指针数组Names的地址来初始化指针nm。每次printf()的调用都首先传递指针nm指向的字符型指针,然后对nm进行自增运算使其指向数组的下一个元素(还是指针)。注意完成上述认为的语法为*nm++,它首先取得指针指向的内容,然后使指针自增。
注意数组中的最后一个元素被初始化为0,while循环以次来判断是否到了数组末尾。具有零值的指针常常被用做循环数组的终止符。程序员称零值指针为空指针(NULL)。采用空指针作为终止符,在树种增删元素时,就不必改动遍历数组的代码,因为此时数组仍然以空指针作为结束。
int * GetDate(int wk,int dy);
main()
{
int wk,dy;
do
{
printf(Enter week(1-5)day(1-7)\n);
if(**fpp<0) break;
Байду номын сангаас else (*fpp)++;
}
首先用一个数组的地址初始化指针fp,然后把该指针的地址作为实参传递给函数FindCredit()。FindCredit()函数通过表达式**fpp间接地得到数组中的数据。为遍历数组以找到一个负值,FindCredit()函数进行自增运算的对象是调用者的指向数组的指针,而不是它自己的指向调用者指针的指针。语句(*fpp)++就是对形参指针指向的指针进行自增运算的。但是因为*运算符高于++运算符,所以圆括号在这里是必须的,如果没有圆括号,那么++运算符将作用于二重指针fpp上。
2、函数指针是指向函数的指针变量,即本质是一个指针变量。
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:
类型说明符 (*函数名)(参数)
现在,回过来看上面的这个函数原型 typedef void(*sighandler_t)(int),盖住 typedef不看 ,再简单不过,sighandler_t就是一个函数指针,指向的函数接受一个整型参数并返回一个无类型指针 。加上typedef之后sighandler_t就是一种新的类型,就可以像int一样地去用它,不同的是它声明是一种函数指针,这种指针指向的函数接受一个整型参数并返回一个无类型指针 。怎么样?简单吧。
三、指向指针数组的指针
指针的指针另一用法旧处理指针数组。有些程序员喜欢用指针数组来代替多维数组,一个常见的用法就是处理字符串。
char *Names[]=
{
Bill,
Sam,
Jim,
//typedef 的用法
typedef void (*sighandler_t)(int);类型说明
2012-10-24 09:05 259人阅读 评论(0) 收藏 举报
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_thandler);
x=(*fptr)();
x=fptr();
第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。下面举一个例子:
void (*funcp)();
void FileFunc(),EditFunc();
//20150711 at sunwoda
一、
在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义:
1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针
类型标识符 *函数名(参数表)
main()
{
funcp=FileFunc;
(*funcp)();
funcp=EditFunc;
(*funcp)();
}
void FileFunc()
int *fp=vals;
FindCredit(&fp);
printf(%d\n,*fp);
}
void FindCredit(int ** fpp)
{
while(**fpp!=0)
格式:
类型说明符 * 函数名(参数)
当然了,由于返回的是一个地址,所以类型说明符一般都是int。
例如:int *GetDate();
int * aaa(int,int);
函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。
此处由于加了typedef自定义了一个新类型sighandler_t,所以第二行的函数原型看起来顺眼多了,形式跟intfunc(char c, int i)无异,但是如果看不懂typedef语句,这两句话仍然是噩梦。
要理解typedef,只要记住一句话就差不多了,那就是:typedef在语句中所起的作用只不过是把语句原先定义变量的功能变成了定义类型的功能而已。我们只消看几个例子立即明白。
指针的指针需要用到指针的地址。
char c='A';
char *p=&c;
char **cp=&p;
通过指针的指针,不仅可以访问它指向的指针,还可以访问它指向的指针所指向的数据。下面就是几个这样的例子:
char *p1=*cp;
Paul,
Charles,
0
};
main()
{
char **nm=Names;
while(*nm!=0) printf(%s\n,*nm++);
{
printf(FileFunc\n);
}
void EditFunc()
{
printf(EditFunc\n);
}
程序输出为:
FileFunc
int *f(x,y);
首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
表示:
float *fun();
float *p;
相关文档
最新文档