深入理解typedef

                                                          深入理解typedef

 

关于typedef的用法,网上已经有很多前辈总结过了,在这里我不想标新立异,代码阅历不一样,所理解的typedef的层次各有不同。这里,我想就我所理解的typedef用更加通俗易懂的方式写出来。

 

 

在开始之前,要始终牢记:

 

typedef的本质是取一个别名

先从简单的说起:

  • typedef alias type型

这里,typedef后面有2个量。这种方式是我们通常见到的最多的用法

 

typedef i_type int;
i_type sun;

Linux下面,变量命名不能将就匈牙利命名法。

typedef就是为一种类型取别名,我们用这个别名去定义变量,那么该变量的类型就是别名的原始引用(可能说引用有些不太恰当)

i_type是int的别名。

 

 

那么用i_type去定义变量

 

i_type sun

 

实际上就是对原始类型(这里的原始变量是指int)的引用

即int sun

 

typedef alias type这种类型的还很多。

 

例如:

 

typedef struct Node{
int type;
.....

}inode;

/*
定义了一个结构体变量。如果没有typedef,我们定义结构体变量的时候,需要加struct关键字。
*/
inode nod;
/*
就上面的定义,
同样,我们一步一步的分析。
首先,去掉typedef关键字
inode是什么?
回答:inode是struct Node的一个结构体变量。

然后,加上typedef。
inode是什么?
回答:inode是一个别名
是谁的别名?
回答:是结构体变量的别名。
既然走到这里,一切都好办了。
*/

inode nod;
/*
再来。既然上面已经说清楚了。inode是结构体变量的别名。
那么,根据别名是对原始类型的引用的理论。上面的语句中,别名的原始类型是结构体变量。

那么,nod是什么?
回答:nod是结构体变量

*/

 这样的例子还很多,我就不一一列举了。

 

 

 

 

  • typedef  express 型

这里,typedef,后面只有包含了别名的一个量或者一个表达式。

 

先举一个例子

 

 

typedef void (*func)(int, char);

func set;
/*
同样,先说说func是什么。
在这里,func表示一个函数指针,该函数有int char两个变量。
所以,func就是一个带两个参数函数的指针

所以,set就是一个带两个参数的函数指针的变量。
既然如此,set就是一个带有两个参数的函数的入口地址。
*/

(*set)(int ,'a');//所以,这里就是合法的
/*
若果没有typedef的话,我们需要3步来完成这个任务

void func(int, char);

void (*set)(int ,char);
set = &func;

set = func也是合法的,这里只是为了强调地址
set = func这种用法参考谭浩强《C语言程序设计》(第三版)P261的小例子
*/

 

 

分析道这里。你应该大概能看到typedef的意思了。

 

typdef  char* point;

去掉typedef,point是一个指向char类型的指针。

 

那么

point ptr

 

ptr也就是一个指向char的指针。

 

为了验证自己的理解,可以随便找几个typedef分析,看能不能分析透彻。

 

 



版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/12/14/6076396.aspx
并请联系谭海燕本人或者前往谭海燕个人主页留言

时间: 2024-10-01 21:54:11

深入理解typedef的相关文章

typedef的这一部分怎么理解

问题描述 typedef的这一部分怎么理解 void = (*FunType)(int) 是这样吗 解决方案 函数指针,很明显不是你说的void = (*FunType)(int).而是指类型为:返回值为空,参数为int类型的函数 建议看一下typedef定义函数指针的说明 解决方案二: 从根本上理解typedef理解typedeftypedef 理解---------------------- 解决方案三: FunType是一个函数指针类型,这样它可以定义变量,用一个同类型的函数来赋值 Fun

结构体struct、枚举enum、联合体union、位字段、自定义类型typedef、字节对齐

结构体struct 1 结构体的基本知识 2 结构体与函数 3 结构体数组 4 自引用结构体 枚举变量enum 联合体union 位字段 1 一般的方法定义屏蔽吗 2 用位字段来定义屏蔽吗 自定义类型typedef 字节对齐 pragma pachx 按x个字节对齐 1.结构体struct 1.1 结构体的基本知识 #include <stdio.h> struct point{ int x; int y; }p1, p2, p3; struct point pt; struct point

c语言-C语言typedef问题,原类型名还有用吗

问题描述 C语言typedef问题,原类型名还有用吗 typedef struct S{intg;char h;}T;以下叙述中正确的是(B) (A) 可用S定义结构体变量 (B) 可用T定义结构体变量 (C) S是struct类型的变量 (D) T是struct类型的变量========书上说Typedef语句的作用仅仅是用"标识符"来代表已存在的"类型名",并未产生新的数据类型,原有类型名依然有效,为何答案A不对呢?参考答案是B,求大侠指教 解决方案 在C里面,

PHP 数组遍历顺序理解_php技巧

比如: <?php$arr['laruence'] = 'huixinchen';$arr['yahoo']    = 2007;$arr['baidu']    = 2008;foreach ($arr as $key => $val) {//结果是什么?} 又比如: <?php$arr[2] = 'huixinchen';$arr[1]  = 2007;$arr[0]  = 2008;foreach ($arr as $key => $val) {//现在结果又是什么?} 要完

深入解析函数指针与返回函数的指针

以下是对函数指针与返回函数的指针进行了详细的分析介绍,需要的朋友可以过来参考下   先看看以下两个代码:1:出自STL-SGI源码<stl_alloc.h> 复制代码 代码如下: static void (*__set_malloc_handler(void (*__f)()))() {  void (*__old)()=__malloc_alloc_oom_handler;  __malloc_alloc_oom_handler=__f;  return (__old); } 2:Linux

深入解析函数指针与返回函数的指针_C 语言

先看看以下两个代码:1:出自STL-SGI源码<stl_alloc.h> 复制代码 代码如下: static void (*__set_malloc_handler(void (*__f)()))(){ void (*__old)()=__malloc_alloc_oom_handler; __malloc_alloc_oom_handler=__f; return (__old);} 2:Linux下的<sginal.h> 复制代码 代码如下: void (*signal (in

typedef 语句的理解

首选先看一下typedef的四个用途和两个陷阱 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,  // 和一个字符变量: 以下则可行: typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针 虽然: char *pa, *pb; 也可行,但相对来说没有用typedef的形式直观,尤

C/C++:如何理解复杂的声明

http://blog.chinaunix.net/u/12783/showart_378340.html   C/C++:如何理解复杂的声明 这里说的声明,不光适用于C/C++,其他的一些语言也能适用. 与java和C#等不同,声明和定义在C/C++中有着比较明显的区别:声明仅仅是介绍名字(introduce names),而定义则会为该名字分配相应的空间.打个通俗的比喻:声明就是你在谈话中提到某个人的名字,而定义就是把你提到的这个人带到谈话的人群中来,让大家见识一下他/她是什么样子. 这里主

深入理解php中的ini配置(1)

这篇文章不会详细叙述某个ini配置项的用途,这些在手册上已经讲解的面面俱到.我只是想从某个特定的角度去挖掘php的实现机制,会涉及到一些php内核方面的知识:-)   使用php的同学都知道php.ini配置的生效会贯穿整个SAPI的生命周期.在一段php脚本的执行过程中,如果手动修改ini配置,是不会启作用的.此时如果无法重启apache或者nginx等,那么就只能显式的在php代码中调用ini_set接口.ini_set是php向我们提供的一个动态修改配置的函数,需要注意的是,利用ini_s