typedef 含义与用法总结 汇总+修改

解决typedef结构体类型的问题 解决typedef修改结构体出现的一点小问题 阅读详情

第一个用途:定义一种类型的别名,不仅仅是简单宏的定义,可以同时声明指针型的多个对象。比如、

char * pa , pb;     //声明一个指向字符变量的指针和一个字符变量

typedef char* PCHAR;

PCHAR pa,pb;     //声明两个指向char类型的指针;


第二个用途:在旧的c代码中,声明新的结构对象,需要关键字struct

格式为:struct + 结构名+对象名

struct tagPOINT1
 {
    int x;
    int y; 
};
struct tagPOINT1 p1;

在c++中则可以直接写为:结构名+对象名  tagPOINT1 p1;

typedef struct tagPOINT
{
    int x;
    int y;
}POINT;

POINT p1;POINT 作为tagPOINT的类型别名。


用途三 用来定义和平台无关的类型

比如定义一个REAL浮点类型,在目标平台上表示最高精度类型为:

typedef  long double REAL;

在不支持long double的平台上改为:

typedef   double REAL;

在不支持double的平台上,改为

typedef  float REAL;

跨平台操作的实现只需要修改typedef本身,不用对源码进行修改。

typedef定义一种类型的新别名,不是简简单单的字符串替换,

用途四:用复杂的声明定义一个新的简单别名,在声明中逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版本。

 原声明:void (*b[10]) (void (*)());
变量名为b,先替换右边部分括号里的,pFunParam为别名一:
typedef void (*pFunParam)();
再替换左边的变量b,pFunx为别名二:
typedef void (*pFunx)(pFunParam);
原声明的最简化版:
pFunx b[10];


 原声明:doube(*)() (*e)[9];
变量名为e,先替换左边部分,pFuny为别名一:
typedef double(*pFuny)();
再替换右边的变量e,pFunParamy为别名二
typedef pFuny (*pFunParamy)[9];
原声明的最简化版:
pFunParamy e;

理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号
就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直
到整个声明分析完。举例:
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。

#include <iostream>
using namespace std;
typedef int (*A) (char, char);
int ss(char a, char b)
{
    cout<<"功能1"<<endl;
    cout<<a<<endl;
    cout<<b<<endl;
    return 0;
}
int bb(char a, char b)
{
    cout<<"功能2"<<endl;
    cout<<b<<endl;
    cout<<a<<endl;
    return 0;
}
void main()
{    A a;
a = ss;
a('a','b');
    a = bb;
    a('a', 'b');
}


/*typedef int (A) (char, char);
void main()
{    A *a;
    a = ss;
    a('a','b');
    a = bb;
    a('a','b');
}*/


如同typedef和define的区别:

案例一:
通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子:
typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;
在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们
所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一
个类型起新名字。


案例二:

#include <iostream>
using namespace std;
typedef  char * pStr;
void main()
{  
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
}

案例中pstr指的就是一个指向char类型的指针类型,可以暂时理解为int。

const pstr p2=string;相当于const int  p2=3;所以运行出错

这就限制了p2是一个不可修改的int常量,永远就是3,只能使用不能修改。

const char *p1 = string;

const char *p1 = string 意思是说一个指向const char类型的指针。

是p2++出错了。这个问题再一次提醒我们:typedef和#define不同,它不是简单的
文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和
const long x本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类
型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数
据类型为char *的变量p2为只读,因此p2++错误。

p2[2] = 'e';

printf(p2);p2可以对string数组中的值进行改变。

#include<stdio.h>

int main(){
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1[1] = 'f';不能给常量赋值
p1++;
p2[2] = 'e';// 可以赋值
p2++;//指针不可移动
printf(p1);
printf(p2);
return 0;
}
下面是错误:
1>c:\test\typedef.cpp(8): error C3892: “p1”: 不能给常量赋值
1>c:\test\typedef.cpp(11): error C3892: “p2”: 不能给常量赋值

当const char * p1时,const修饰的是char,所以p1不能修改指向的值;
当const PStr p2时,const修饰的是p2,所以p2不能对自身做任何修改;


以下为对精彩评论的引用:

其实,在这里主要就是对const的作用范围的理解。
typedef char * pStr;
char string1[4] = "abc";
char string2[4] = "def";
const char *p1 = string1;
const pStr p2 = string1;

p1[1] = 'f'; // 此句错
p1++; // 此句对
p1 = string2; // 此句对
p1[1] = 'x'; // 此句错

p2[1] = 'f'; // 此句对
p2++; // 此句错
p2 = string2; // 此句错

在const char *p1中,const的作用力量在p1所指的内容,也就是说,当p1指向string1时,string1的内容相对于p1来说是常量,是固定的,是不能改变的,所以p1[1] = 'f'这一句就是错误的,而p1自身的值(即地址值)是可以改变的,所以p1++和p1 = string2都是正确的。
在const pStr p2中,const的作用力量在p2,即p2是个常量,p2的值实际上是个地址,也就是说,p2已经固定了,它的值是不能变的,但它这个地址所指的内容是可以改变的,所以p2[1] = 'f'是对的,但p2 = string2是错误的,因为这句是想将另一个地址赋值给p2。
总体来说,一个是将内容固定为常量,一个是将地址固定为常量,也就是指针常量和常量指针的说法,p1是常量指针,p2是指针常量。这也是C中指针的魅力所在。








typedef函数指针的用法[转+修改] typedef函数指针的用法(C++)[转+修改] 阅读详情

相关推荐

c 编程替换语言,巧用typedef替换类型

为了方便我们编写程序,通常我们在利用C语言进行编写程序的过程中都会给某一数据类型替换一个新的称,而往往我们通过使用关键字typedef来给数据类型进行称的替换。那么到底什么是关键字typedef呢?下面课课家笔者简单为大家介绍C语言中的关键字typedef的概念和用法。首先笔者先给大家举个简单的例子。比如一个结构体的字是stu,通常我们要想定义一个结构体变量需要这样编写:structstus...

weixin_42504785的博客 1091

C++ typedef 用法详解

typedef是替一个对象取一个别,以此增强程序的可读性。 1 定义一种数据类型的别 typedef int INT; //定义int类型的一个别INT。注意:末尾的分号 typedef char* pStr; 2 定义结构体的别(很久远的事情了,现在C++已经不存在这个问题) struct sPositon //结构体定义 { int x; int ...

cuizhiyi2008的专栏 5360

typedef用法

用途一: 定义一种类型的别,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb;  // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,  // 和一个字符变量; 以下则可行: typedef char* PCHAR;  // 一般用大写 PCHAR pa, pb;        // 可行,同时声明了两个指向字符变量的指针 虽然

冷秋魂的专栏 1192

Typedef Struct 用法详解

Typedef Struct 用法详解 一、typedef用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别,它是语言编译过程的一部分,但它并不实际分配内存间。 实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增强程序的可读性,以及标识符的灵活性...

PengCoX 9928

C++typedef用法总结

在总结中,比较简单的我只是做了简略的总结,对我来说比较难理解的做了重点的解析。用于为基本数据类型定义一个新的字,使代码更具可读性或便于修改。示例:这里将int类型定义为Integer,之后就可以使用Integer来声明变量,就像使用int一样。这种方式在代码中如果需要频繁使用int类型,并且希望提高代码可读性(例如,Integer可能暗示这个int变量在特定的业务逻辑中有特殊含义)或者在需要修改类型时(比如将int为long),只需要修改typedef语句即可。在深入typedef

small__dogs的博客 4513

C语言中typedef用法

double x;double y;double z;在这里,结构体 struct Point 为新的数据类型,在定义变量的时候均要向上面的调用方法一样有保留字 struct,而不能像 int 和 double 那样直接使用 Point 来定义变量。double x;double y;double z;} Point;在上面的代码中,实际上完成了两个操作:double x;double y;double z;

pangyushuang的博客 1万+

typedef用法

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

qingtu11的博客 6966

关于typedef用法总结

在C还是C++代码中,typedef都使用的很多,在C代码中尤其是多。typedef#define有些相似,其实是不同的,特别是在一些复杂的用法上,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,加上自己的一个分析。

IT民工 15万+

C语言typedef用法

参考链接 一、概念 C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型称。 示例: typedef int BOOL;//定义一个布尔类型 #define TRUE 1 #define FALSE 0 //定义好之后,就可以像使用基本类型数据一样使用它了,如下面的代码所示: BOOL bflag=TRUE; 二、typedef的4种用法 为基本数据类型定义新的类型 比如跨平台时,有的机子不支持long double,但有需要高精度的一个类型计算,那就可以进行如下定义: typ

qq_37233070的博客 1万+

python typedef用法_typedef用法,C语言typedef详解

C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型称,来替代系统默认的基本类型称、数组类型称、指针类型用户自定义的结构型称、共用型称、枚举型称等。一旦用户在程序中定义了自己的数据类型称,就可以在该程序中用自己的数据类型称来定义变量的类型、数组的类型、指针变量的类型函数的类型等。例如,C 语言在 C99 之前并未提供布尔类型,但我们可以使用 typedef 关...

weixin_39963830的博客 1111

typedef用法总结

在C还是C++代码中,typedef都使用的很多,在C代码中尤其是多。typedef#define有些相似,其实是不同的,特别是在一些复杂的用法上,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,加上自己的一个分析。 基本定义: typedef为C语言的关键字,作用是为一种数据类型定义一个新字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的...

weixin_49638349的博客 2224

java typedef用法,typedef

之前用typedef的时候大多是用在把一个很长的成一个很短的字比如usigned int 取个别叫uint这种,今天查了一下发现用途远不止这些。。typedef四个用途用途一:定义一种类型的别,而不只是简单的宏替换,可以用作同时声明指针型的多个对象。char *pa,pb;//这样只声明了一个指向字符变量的指针和一个字符变量(这样写可能会觉得是声明了char * 类型的两个指针,其实并...

weixin_31974659的博客 3390

struct用法_一句话帮你理解typedef用法

来源:公众号【编程珠玑】作者:守望先生网站:https://www.yanbinghu.com前言在C语言中typedef用来给复杂声明定义别非常的方便,不过有时候typedef在复杂声明中不好理解。本文关键的一句话帮你理解ytpedef的用法typedef常见应用场景在这之前,我们来看看一些常见应用场景。为特定含义类型取别例如,假设速度是整型值:typedefintSpee...

weixin_39651325的博客 118

typedef和define的区别、typedef的具体用法

define这里为什么报错呢?是因为#define integer int*只能声明一个指针i,对第二个j是个int类型的数据,相当于int *i,j;所以变量j不能赋值一个地址,即会报错。unsigned integer会使代码报错,原因是typedef只能对数据类型进行整体封装,不能局部封装,所以当你想要对unsigned int类型进行取别时,只能整体取。typedef最核心的用法:给数据类型取别,这个别既可以是此数据类型的替换,也是指向此数据类型的指针。

lxwyyds的博客 2588

C语言基础-typedef用法

typedef用法说明

赞的博客 1087

typedef用法

目录 第一、四个用途 用途一: 用途二: 用途三: 用途四: 第二、两大陷阱 陷阱一: 陷阱二: 第三、typedef #define的区别 案例一: 案例二: 第四部分资料:使用 typedef 抑制劣质代码 第一、四个用途 用途一: 定义一种类型的别,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: typedef cha.

weixin_36670529的博客 862
上一篇: win32控制台程序和win32程序的区别
下一篇: 关于C++ const 总结
maple2150
博客等级 码龄12年 7粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值