区别如下:
(1)原理不同
#define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。
typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。
(2)功能不同
typedef用来定义类型的别名,起到类型易于记忆的功能。另一个功能是定义机器无关的类型。如定义一个REAL的浮点类型,在目标机器上它可以获得最高的精度:typedef long double REAL, 在不支持long double的机器上,看起来是这样的,typedef double REAL,在不支持double的机器上,是这样的,typedef float REAL
#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
(3)作用域不同
#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用,而typedef有自己的作用域。
(4)对指针的 *** 作不同
#define INTPTR1 int
typedef int INTPTR2;
INTPTR1 p1, p2;
INTPTR2 p3, p4;
含义分别为,
声明一个指针变量p1和一个整型变量p2
声明两个指针变量p3、p4
#define INTPTR1 int
typedef int INTPTR2;
int a = 1;
int b = 2;
int c = 3;
const INTPTR1 p1 = &a;
const INTPTR2 p2 = &b;
INTPTR2 const p3 = &c;
上述代码中,
const INTPTR1 p1是一个常量指针,即不可以通过p1去修改p1指向的内容,但是p1可以指向其他内容。
const INTPTR2 p2是一个指针常量,不可使p2再指向其他内容。因为INTPTR2表示一个指针类型,因此用const限定,表示封锁了这个指针类型。
INTPTR2 const p3是一个指针常量
扩展资料:
define的作用:
被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。
宏定义的作用范围仅限于当前文件,即file1c中定义 #define PI 314,在file2c中该宏定义不起作用;通过将#define PI 314定义在commonh中,file1c和file2c分别#include "commonh"的方式,该宏定义在file1c和file2c中都起作用。
在C或C++语言中,“宏”分为有参数和无参数两种。
参考资料:
typedef-百度百科
1、栈区的使用
栈区写入内存的的顺序是先进后出。
存放的是函数的参数、返回值、局部变量
由编译器管理数据开辟和释放
变量的生命周期在该函数结束后自动释放
不要返回局部变量的值,因为局部变量在函数执行之后就释放掉了,无法读取原来的内存
2、堆区的使用
堆区的空间远远大于栈区
它没有先进后出的数据结构
由程序员手动开辟和释放,malloc、calloc开辟free释放
注意:
如果主调函数中没有给指针分配内存,那么被调函数中需要利用高级指针给主调函数中的指针分配内存
3数据区放的是静态变量、全局变量以及常量
static静态变量: 编译阶段分配内存,只能在当前文件内使用,只初始化一次
ertern全局变量:C语言下默认的全局变量前都默认隐藏了该关键字
4const修饰的变量
直接修改const修饰的全局变量:失败
简介修改const修饰的全局变量:失败,原因是放在常量区,受到保护
直接修改const修饰的局部变量:失败
直接修改const修饰的局部变量:成功,该局部变量其实放到了栈区,是伪常量
5字符串常量
不同编译器的处理方式有所区别
ANSI并未指定它的修改方式
有些编译器可以修改字符串常量,但有些不可以,某些编译器将相同的字符串常量看做同一个字符串常量
6void的使用方式
无类型,不可以创建变量,无法分配内存
限定函数返回值
限定函数参数列表
void是万能指针,不需要强制转化就可以给其他指针赋值
7sizeof的使用
sizeof的本质其实是一个运算符,类似于+-/
当统计某类型占的空间时需要加()
当统计mou变量占的空间时无需加()
返回值的类型是无符号整形,即unsigned int
数组名称如果作为函数参数,会退化为指针,指向数组首元素
8typedef的使用
它可以给类型起别名
简化struct关键字
区分数据类型
提高代码的可移植性
在C语言中,typedef是一种类型定义关键字,用于为现有的数据类型创建新的类型名。
使用typedef可以将现有的数据类型(如int,float,char等)重新命名为其他名称,或者用现有的数据类型定义新的数据类型。
下面是一个简单的示例,使用typedef将int类型重新定义为myint类型:
现在,可以使用myint代替int来声明变量或函数,例如:
这个定义和下面的定义是等价的:
typedef的主要优点是可以使代码更加清晰易懂,同时可以简化代码中的类型声明。在复杂的程序中,使用typedef可以使代码更加易读,因为可以将较长的数据类型名称缩短为更容易理解的名称。
类型定义。
它就和define相对应,define是把一个自己起的名字的常量定义为代替它的另一个常量来同。
typedef是把一个自己起的名字的类型用已经有的类型代替使用,如:typedef int Type1;之后如果有Type1 i ;系统则理解为int i;。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
扩展资料
define被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。
宏定义的作用范围仅限于当前文件,即file1c中定义 #define PI 314,在file2c中该宏定义不起作用;通过将#define PI 314定义在commonh中,file1c和file2c分别#include "commonh"的方式,该宏定义在file1c和file2c中都起作用。
在C或C++语言中,“宏”分为有参数和无参数两种。
#define GPEBLT_FUNCNAME(basename) (SCODE (GPE::)(struct GPEBltParms ))&GPE::##basename
在#define中,标准只定义了#和##两种 *** 作。#用来把参数转换成字符串,##则用来连接前后两个参数,把它们变成一个字符串。
输出为:token 9 = 10
详见百科typedef(相似)。
参考资料来源:百度百科-define
C语言中,使用typedef 定义一个函数指针类型的书写格式如下:
typedef 返回值类型 (函数指针类型名称)(参数列表);
为方便理解,下面在手机上使用易历知食软件内部的微C程序设计来编程,演示其定义方式,并写个测试函数,再通过函数指针来调用测试函数,在手机上的代码如下图(图截取自手机):
运行结果如下图:
以上就是关于typedef和define具体的详细区别全部的内容,包括:typedef和define具体的详细区别、C语言栈区、堆区的使用,typedef和sizeof的使用、有没有好心人能帮我解释一下这个typedef到底是啥啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)