首页 > 其他分享 >typedef

typedef

时间:2022-11-16 22:02:34浏览次数:48  
标签:typedef name int 类型 Foo 变量

再谈 typedef(重点为函数指针)

有种很方便的写法。

typedef int *p;
p pointer;

这时直接把pointer带入原式中,取代p然后去掉typedef,得到的结果就是int * pointer;
哈哈,这样直接替换就很直观多了。
C 语言语法简单,但内涵却博大精深;如果在学习时只是止步于表面,那么往往后期
会遇到很多困难。typedef 是 C 语言中一个很好用的工具,大量存在于已有代码中,特别值
得一提的是:C++标准库实现中更是对 typedef 有着大量的使用。但很多初学者对其的理解
仅局限于:typedef 用来定义一个已有类型的"别名(alias)"。正是因为有了这样的理解,才有
了后来初学者在 typedef int myint 和 typedef myint int 之间的犹豫不决。很多国内大学的 C
语言课之授课老师也都是如是说的,或者老师讲的不够透彻,导致学生们都是如是理解的。
我这里想结合 C 语言标准文档以及一些代码实例,也说说

typedef。
int *p;

这样的代码是 C 语言中最最基础的一个语句了,大家都知道这个语句声明了一个变量
p,其类型是指向整型的指针(pointer to int);如果在这个声明的前面加上一个 typedef 后,
整个语义(semantics)又会是如何改变的呢?
typedef int *p;
我们先来看看 C99 标准中关于 typedef 是如何诠释的?C99 标准中这样一小段精辟的
描述:

“In a declaration whose storage-class specifier is typedef, each
declarator defines an identifier to be a typedef name that denotes the
type specified for the identifier in the way described in xx”.

参照这段描述,并拿 typedef int *p 作为例子来理解:在一个声明中,如果有存储
类说明符 typedef 的修饰,标识符 p 将被定义为了一个 typedef name,这个 typedef name
表示(denotes)一个类型,什么类型呢?就是 int p 这个声明(declarator)中标识符
(indentifier)p 的类型(int
)。
再比对一下两个声明:

int *p;
typedef int *p;

是不是有点"茅舍顿开"的感觉,int *p 中, p 是一个变量,其类型为 pointer to int;在 int
*p 前面增加一个 typedef 后,p 变为一个 typedef-name,这个 typedef-name 所表示的类型
就是 int p 声明式中 p 的类型(int)。说句白话,typedef 让 p 去除了普通变量的身份,摇身
一变,变成了 p 的类型的一个 typedef-name 了。
为了巩固上面的理解,我们再来看看"C 语言参考手册(C: A Reference Manual)"中的说
法:任何 declarator(如 typedef int *p)中的 indentifier(如 p)定义为 typedef-name, 其(指
代 p)表示的类型是 declarator 为正常变量声明(指代 int p)的那个标识符(指代 p)的类型
(int
)。有些绕嘴,不过有例子支撑:
[例 1]

typedef double MYDOUBLE;

分析:
去掉 typedef ,得到正常变量声明=> double MYDOUBLE;
变量 MYDOUBLE 的类型为 double;
=> "typedef double MYDOUBLE"中 MYDOUBLE 是类型double 的一个 typedef-name。
MYDOUBLE d; <=> d 是一个 double 类型的变量
[例 2]

typedef double *Dp;

分析:
去掉 typedef ,得到正常变量声明=> double Dp;
变量 Dp 的类型为 double
,即 pointer to double;
=> "typedef double Dp"中 Dp 是类型 double的一个 typedef-name。
Dp dptr; <=> dptr 是一个 pointer to double 的变量
[例 3]

typedef int* Func(int);

分析:
去掉 typedef ,得到正常变量声明=> int* Func(int);
变量 Func 的类型为一个函数标识符,该函数返回值类型为 int*,参数类型为 int;
=> "typedef int* Func(int)"中 Func 是函数类型(函数返回值类型为 int*,参数类型为 int)
的一个 typedef-name。
Func *fptr; <=> fptr 是一个 pointer to function with one int parameter, returning a
pointer to int
Func f; 这样的声明意义就不大了。
[例 4]

typedef int (*PFunc)(int);

分析:
去掉 typedef ,得到正常变量声明=> int (*PFunc)(int);
变量 PFunc 的类型为一个函数指针,指向的返回值类型为 int,参数类型为 int 的函数
原型;
=> "typedef int (*PFunc)(int)"中 PFunc是函数指针类型(该指针类型指向返回值类型为
int,参数类型为 int 的函数)的一个 typedef-name。
PFunc fptr; <=> fptr 是一个 pointer to function with one int parameter, returning int

#include "iostream"
using namespace std;
int add(int a,int b){
return (a+b);
}
typedef int (* func)(int ,int ) ;
void main(){
func f = add;
int n = f(1,2);
cout << n << endl;
}

[例 5]

typedef int A[5];

分析:
去掉 typedef ,得到正常变量声明 => int A[5];
变量 A 的类型为一个含有 5 个元素的整型数组;
=> "typedef int A[5]"中 A 是含有 5 个元素的数组类型的一个 typedef-name。
A a = {3, 4, 5, 7, 8};
A b = { 3, 4, 5, 7, 8, 9}; /* 会给出 Warning: excess elements in array initializer */
[例 6]

typedef int (*A)[5]; //(注意与 typedef int* A[5]; 区分)

分析:
去掉 typedef ,得到正常变量声明 => int (*A)[5];
变量 A 的类型为 pointer to an array with 5 int elements;
=> “typedef int (*A)[5]“中 A 是"pointer to an array with 5 int elements"的一个
typedef-name。
int c[5] = {3, 4, 5, 7, 8};
A a = &c;
printf(”%d\n”, (a)[0]); / output: 3 /
如果这样赋值:
int c[6] = {3, 4, 5, 7, 8, 9};
A a = &c; /
 会有 Warning: initialization from incompatible pointer type */
[例 7]

typedef struct _Foo_t Foo_t;

分析:
去掉 typedef ,得到正常变量声明 => struct _Foo_t Foo_t;
变量 Foo_t 的类型为 struct _Foo_t;
=> "typedef struct _Foo_t Foo_t"中 Foo_t 是"struct _Foo_t"的一个 typedef-name。
[例 8]
typedef struct { … // } Foo_t;
分析:
去掉 typedef ,得到正常变量声明 => struct { … // } Foo_t;
变量 Foo_t 的类型为 struct { … // } ;
=> "typedef struct { … // } Foo_t "中 Foo_t 是"struct { … // }"的一个 typedef-name。
这里 struct {…//}是一个无"标志名称(tag name)"的结构体声明。

转载:https://wenku.baidu.com/view/2a1689cada38376baf1fae79.html

标签:typedef,name,int,类型,Foo,变量
From: https://www.cnblogs.com/amxiang/p/16897654.html

相关文章

  • C语言 #define 和 typedef 区别
    在C语言编程中,typedef和 #define是最常用语句,可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别。typedef的用法在C/C++语言中,typedef常用来定义一个标识......
  • PCD_StateTypeDef
    /***@brief PCDStatestructuredefinition*/typedefenum{   HAL_PCD_STATE_RESET  =0x00,   HAL_PCD_STATE_READY  =0x01,   HAL_PCD_STATE_ERR......
  • USB_CfgTypeDef
    /** *@brief USBInitializationStructuredefinition */typedefstruct{ uint32_tdev_endpoints;          /*!<DeviceEndpointsnumber.   ......
  • USBD_HandleTypeDef
    /*USBDevicehandlestructure*/在DEVICE库里面,最主要的数据结构是USBD_HandleTypeDef,它将USB传输中的数据抽象到该数据结构内.该结构体包含所有变量和结构体,用以实时......
  • C语言之存储类,枚举,结构体,共用体,typedef
    目录1存储类1.1auto存储类1.2register存储类1.3static存储类1.4extern存储类2枚举2.1定义2.2操作枚举2.2.1用for循环遍历枚举3结构体3.1定义结构3.2操作结构......
  • c语言学习--typedef取别名
    typedef是用来给类型去别名的用法:  typedef原类型新类型#include<stdio.h>#include<stdlib.h>//typedef变量取别名intmain(void){inta=10;......
  • 关于struct和typedef
    c/c++中有定义数据结构语句structstudent//定义数据结构体{inta;//.....}structstudenta1;//初始化变量可以看到,定义结构体后每次进行初始......
  • 【C语言_24】typedef关键词
    1.typedef定义类型别名定义int的别名int32_t:typedefintint32_t;2.typedef的使用#include<stdio.h>intmain(){typedefintint32_t;//作用域:{}里申请的,只能在{}里用i......
  • C语言第20天,typedef关键词和条件编译
    1.给整型类型取别名原因:我们在整型数据类型中讨论过的,C语言标准并未规定这些数据类型的大小范围,具体的实现交由了编译器和平台决定。也就是说,int在VisualStudio2019中......
  • typedef 结构体类型名可以相同
    typedefstructWebsMime{ char*type;/**<Mimetype*/ char*ext;/**<Fileextension*/}WebsMi......