文档库 最新最全的文档下载
当前位置:文档库 › C语言中typedef用法

C语言中typedef用法

C语言中typedef用法
C语言中typedef用法

typedef关键字用法 免费下载

typedef用法 1、为现有数据类型定义同义词 typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。 例如: typedef int size; 此声明定义了一个int的同义字,名字为size。注意typedef并不创建新的类型。 它仅仅为现有类型添加一个同义字。你可以在任何需要int的上下文中使用size: void measure(size*psz); size array[4]; 2、typedef还可以掩饰复合类型,如指针和数组 z数组 例如:typedef char Line[81];表示使用Line代表具有81个元素的char类型数组。如果要生成类似的数据可以使用如下形式:Line text,secondline; 相当于char test[81];char secondline[81]; z隐藏指针语法 例如:typedef char*pstr; int mystrcmp(pstr,pstr);相当于 int mystrcmp(char*,char*); 注意:标准函数strcmp()有两个‘const char*'类型的参数。因此,它可能会误导人们象下面这样声明mystrcmp(), int mystrcmp(const pstr,const pstr); 这是错误的,‘const pstr'被解释为‘const char*‘(一个指向char的常量指针),而不是‘char*'(指向char的指针)。 修改:添加,typedef const c pstr; 记住:不管什么时候,只要为指针声明typedef,那么都要在最终的typedef 名称中加一个const,以使得该指针本身是常量,而不是对象 z链表中应用 例如: typedef struct node {

typedef使用详解

typedef使用详解 1.再论typedef 1.1、如何轻松理解和应用typedef? typedef用最简单的话去诠释他,那么就是给类型取别名。但是牠并没有你想象的那么简单!举例:typedef int size;//那么int就有一个别名叫size了,以后size就和int这个类型是一样的用法了。 看到这里,如果你仅仅认为typedef不过如此,不就是把第一个参数(类型名),等同于第二个参数,这么简单。那你可能就会陷入困境。 比如看下面这个例子: typedef char Line[81]; 你能说Line[81]就是char的别名吗?这显然不对。它真正的含义是:Line类型即代表了具有81个元素的字符数组。那么Line t;就等同于char t[81];看到这里读者是否晕了?我们尝试把它放在一起看看。 typedef int size; //typedef行 int i; //原型行 size i; //应用行 同理: typedef char Line[81]; //typedef行 char t[81]; //原型行 Line t; //应用行 再举一个函数指针的例子: typedef int (*fun_ptr)(int,int); //typedef行 int (*fp)(int,int); //原型行 fun_ptr fp; //应用行 以上3个例子都有以下几个共同点: 1、“typedef行”和“原型行”相比,“typedef行”仅仅多个typedef而已。就函数指针的例子来说,其次,“typedef行”和“原型行”的根本区别在于:fun_ptr是类的别名,fp是该类的变量。 2、“原型行”和“应用行”,它们的编译结果是一样的。就函数指针的例子来说,他们都是创建了一个类型为int (*)(int,int)的函数指针fp。只是fun_ptr fp(应用行)比int (*fp)(int,int)(原型行)这种形式更加简洁,便与书写和理解。形式越复杂typedef 的优势就越明显。 Typedef的定义应用和理解应该是一步到位的。 定义过程:只要我们能写出原型行,就能直接写出typedef行。应为形式上只差一个typedef。如:我们写出原型:char t[81],那么加上一个typedef就能得到我们想要的定义,当然可以修改下类名,如:typedef char T[81]。 应用过程:T t;其中T是之前定义的类型,t是通过该类型定义的变量。 理解过程:如何理解“T t;”要想理解“T t;”就找到与之对应的“原型行”,但是“原型行”一般在程序中是不会出现,所以只能先找到“typedef行”,在通过“typedef行”推出“原型行”(推的过程就是去掉typedef而已)。 “T t;”的“typedef行”为typedef char T[81],所以“T t”所表示的“原型行”就是char x[81],而“原型行”和“应用行”(这里“T t;”就是应用行),的含义完全相同。那么对“T t;”的理解就是对char x[81]的理解。 在“T t”的定义中,T的typedef定义形式为:

C语言的32个关键字意义与用法

C语言的32个关键字意义与用法 2009-11-20 13:19 1)auto 声明自动变量。可以显式的声明变量为自动变量,只要不是声明在所有函数文前的变量,即使没有加auto关键字,也默认为自动变量。并且只在声明它的函数内有效。而且当使用完毕后,它的值会自动还原为最初所赋的值。自动变量使用时要先赋值,因为其中包含的是未知的值例如:auto int name=1 2)static: 声明静态变量。可以显式的声明量为静态变量。也为局部变量。只在声明它的函数内有效。它的生命周期从程序开始起一直到程序结束。而且即使使用完毕后,它的值仍不还原。即使没有给静态变量赋值,它也会自动初始化为0,例:static int name=1 3)extern: 声明全局变量。用时声明在main函数之前的变量也叫全局变量。它可以在程序任何地方使用。程序运行期间它一直存在的。全局变量也会初始化为0,例:extern int name 4)register: 声明为寄存器变量。也为局部变量,只在声明它的函数内有效。它是保存寄存器中的,速度要快很多。对于需要频繁使用的变量,使用它来声明会提高程序运行速度。例: register int name=1 5)int: 声明量的类型。int为整数型。注意在16位和32位系统中它的范围是不用的。16位中占用2个字节;32位中占用4个字节。还可以显式的声明为无符号或有符号:unsigned int signed int.有符号和无符号的区别就是把符号也当作数字位来存储;也可以用short和long来声明为短整型或长整行例: int mum 6)float: 声明变量的类型。float浮点型,也叫实型。它的范围固定为4个字节。其中6位小数位,其他为整数位。例: float name 7)double: 声明为双精度类型。它的范围为8个字节,14位为小数位。也可使用更高精度的long double.它的范围则更大,达到10字节。例: double name 8)struct: 声明结构体类型。结构体可以包含各种不类型的量。比如可以把整型,字符型等类型的变量声明在同一个结构体种,使用的时候使用结构体变量直接可以调用。例: struct some{ int a=1; float b=1.1 double=1.1234567 }KKK;

Origin 使用问题

Origin 使用问题集锦 1. 请教怎样反读出 origin 曲线上全部数据点? 如,我用 10个数据点画出了一条 origin 曲线,并存为 project的.OPJ 格式。但,现在我想利用 OPJ 文件从这条曲线上均匀的取出 100个数据点的数值,该如何做?注:要一切都使用 origin 软件完成,不用其他曲线识别软件。 Answer: ORIGIN 中,在分析菜单(或统计菜单)中有插值命令,打开设置对话框,输入数据的起点和终点以及插值点的个数,OK!生成新的插值曲线和对应的数据表格。 2. 如何用origin 做出附件中的图: 其中标注的三角形、方块是怎么整上去的? Answer: 选中左侧竖工具条中的 draw tool(显示是几个点,第七个工具),移动到你要标注的位置双击,就产生了一个点,依次标注完方块。再标注三角的第一个点,标注完后改成三角,以后标注的就都是三角了。改动点的类型的方法和正常画曲线方式一样。 3. 如何用origin 做出附件图中的坐标轴(带刻度)?

Answer: 你把刻度改成那样不就行了。 8.0 的具体方法是双击坐标轴,title & format --> 选左边那个 bottom,然后在右边把 axis 改为 at position=。同理,然后选左边的 left,把axis也改为 at position=。 4. origin能否读取导入曲线的坐标? 一张 bmp 格式的图片,图片内容是坐标系和拟合曲线,但是不知道用什么软件绘制的。请问能否将该图片导入 origin,读出曲线上任意一点的数据? Answer: (1). 1.ORIGIN 有一个图形数字化插件可完成该任务。 2.有许多专门的图形数字化软件也可完成此任务。个人感觉专门的比插件也用、便捷。推荐 WINDIG25 (2). origin下的数字化插件是digitizer,下载地 址:https://www.wendangku.net/doc/1e391324.html,/fileexchange/details.aspx?fid=8拖入origin即可,但使用不是很方便。比较方便的是un-scan-it。 5. 如何在origin7.5 中标峰值? 用origin7.5 作的XRD图,怎样直接在峰上标数据? Answer: Tools/Pick peaks 设置一下点击 Find Peaks 就 OK了。Positive和Negative 是标正负峰值的意思,其他数值改变一下就知道干吗用的了。 6. 关于origin 拟合曲线延长的问题? 我想把拟合之后的直线向前或向后延长一段距离与坐标轴相交。但是不知道该怎么弄。是不是要改那个范围的最大值和最小值啊?可是怎么改?

origin8使用小技巧

人人网- 日志分享 1. 请教怎样反读出origin曲线上全部数据点? 如,我用10个数据点画出了一条origin曲线,并存为project的.OPJ格式。 但,现在我想利用OPJ文件从这条曲线上均匀的取出100个数据点的数值,该如何做? 注:要一切都使用origin软件完成,不用其他曲线识别软件。 https://www.wendangku.net/doc/1e391324.html,/bbs/viewthread.php?tid=1390313 [1] Answer: ORIGIN中,在分析菜单(或统计菜单)中有插值命令,打开设置对话框,输入数据的起点和终点以及插值点的个数,OK!生成新的插值曲线和对应的数据表格。 2. origin中非线性拟合中logistic模型的疑问? origin 中非线性拟合中的logistic模型为 y = A2 + (A1-A2)/(1 + (x/x0)^p) 其初始参数设置为 sort(x_y_curve); //smooth(x_y_curve, 2); x0 = xaty50( x_y_curve ); p = 3.0;

A1 = max( y_data ); A2 = min( y_data ); A1 = min( y_data ); A2 = max( y_data ); 而据我看到的logistic的模型都是(自己origin中自定义的) y =A1/(1+(A1/A2-1)*exp(-k*x)) 也就是说 origin 中的logistic有4个数值需要确定,而自定义的有3个数值 从结果来看,没有太大区别,但为什么函数不一样呢? 不是学数学,高人能否详细说明下。 https://www.wendangku.net/doc/1e391324.html,/bbs/viewthread.php?tid=1391522 [2] Answer: 你可以看一下这个文档,里面有数种不同形式的 logistic 模型: https://www.wendangku.net/doc/1e391324.html,/web/packages/drc/drc.pdf [3] 当然,这是一个 R (https://www.wendangku.net/doc/1e391324.html,) 包的文档,但不妨碍你看其中的公式。 R 是开源的啊,以 GPL 发布,可以从 https://www.wendangku.net/doc/1e391324.html, [4]上了解更多。I 3. 如何用origin做出附件中的图:其中标注的三角形、方块是怎么整上去的?https://www.wendangku.net/doc/1e391324.html,/bbs/viewthread.php?tid=1393739 [5] Answer:

C语言中typedef用法

[编辑本段] C语言中typedef用法 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。 至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。 2. typedef & 结构的问题 当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明:typedef struct tagNode { char *pItem; pNode pNext; } *pNode; 答案与分析: 1、typedef的最简单使用 typedef long byte_4; 给已知数据类型long起个新名字,叫byte_4。 2、typedef与结构结合使用 typedef struct tagMyStruct { int iNum; long lLength; } MyStruct; 这语句实际上完成两个操作: 1) 定义一个新的结构类型 struct tagMyStruct { int iNum; long lLength; }; 分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMy Struct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。 2) typedef为这个新的结构起了一个名字,叫MyStruct。 typedef struct tagMyStruct MyStruct; 因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct var Name来定义变量。 答案与分析 C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。 根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNo de。 解决这个问题的方法有多种: 1)、 typedef struct tagNode { char *pItem; struct tagNode *pNext; } *pNode; 2)、 typedef struct tagNode *pNode; struct tagNode { char *pItem; pNode pNext; }; 注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。 3)、规范做法: struct tagNode { char *pItem; struct tagNode *pNext; }; typedef struct tagNode *pNode; 3. typedef & #define的问题

typedef int Datatype什么意思

typedefintDatatype什么意思?typedef什么意思?怎么用?有没有具体点系统点的解释2009-10-06 09:05 提问者:ayako470 |浏览次数:1376次 问题补充: 这个我有些不明白的地方请问如果没有用typedef定义直接写datatype value 是什么意思?还有用typedef命名类型后便可以跟什么(比如变量或是常数什么的?)都能跟什么样的数据?(因为我觉得int和datatype都是类型名吧怎么能把一个类型定义为另一个类型啊?好神奇~呵呵)最后再次说声谢谢! 我来帮他解答 您还可以输入9999 个字 满意回答 2009-10-06 10:28 typedef就是重新命名类型的意思。。。 typedefintDatatype; 就是将int再起了个名字Datatype; 定义变量时,可以intcalue; 也可以Datatype value; 因为重新命名了,肯定有其用意。 所以一般typedefintDatatype; 之后用Datatype value;定义整型变量。。。 不知道我说清楚没有??o(∩_∩)o... 43|评论(1) typedefint status是什么意思能举个例子吗具体是怎么操作的? 2010-03-24 17:33提问者:为理想的人 |浏览次数:1793次 我来帮他解答 满意回答

2010-03-24 20:18 typedefint status; 是个自定义类型的语句。 typedef用来定义类型的别名。 status i; 就相当于 inti; 至于为什么叫status,原因可能为status的英文意思是状态,编程者想用int值表示一个状态,所以自定义一个类型。 这样status i;一看就知道变量i表示一个状态变量。 而inti;就不能传达给读者这样一个意思。 但是本质上是一样的,这样写就是为了传达编程的信息,方便以后维护,和读程序。

C++ typedef的作用

C和C++中的typedef的作用 C和C++中的typedef的作用是定义一个类型的别名。其用法如下: (1)typedefintElemtype;基本用法作用是定义int 的别名Elemtype。 (2)typedefintarr[100]; 定义一个数组的别名arr,arr的类型是长度为100的整型数组,此后用arr定义的都是长度为100的int数组。 (3)typedefstruct node{ }Node; 定义一个结构体的别名,此后可以用Node代替struct node定义结构体变量。 (4)typedefint (*pf)(int); 定义一个指针类型的别 名pf,此后pf定义的都是指向函数的指针,且只能指向有一个int型参数的类型为int型函数。 int fun(int x) { return x; } pf p; p=fun; (5)typedefint* (*pf)(int); 定义一个指针类型的别

名pf,此后pf定义的都是指向函数的指针,且只能指向有一个int型参数的类型为int *的函数。 int* fun(int x) { return &x; } pf p; p=fun 从typedef别名的作用域看C++与C的安全性区别(转) 以前我知道可以用typedef来为类型起个别名,如“typedef long INDEX;”。给long这样的类型起别名主要目的不是简化程序的书写,它有两个用处:一是表明该类型的特殊作用,二是将来有可能要改变这种类型(比如提高精度),如果直接声明为long型则失去了程序的可惟护性——每一个变量的声明都要改动;而声明为INDEX则使维护程序变得十分简单——只要改一下typedef语句即可。 然而今天我才发现,这么长时间以来我一直是“只知其一不知其二”,今天才发现这个语句也可以在类里面定义,表示这个类型别名只在本类里面起作用。 class MyClass { public: typedef long INDEX; ... }; 如果该语句放在public段中,则可以在类外部使用,比如: MyClass::INDEX usercode;//声明一个变量 而如果放在private段中,则只能在类内使用。 以往我也经常用typedef,但是从来没有在类里面用过。今天算是学了一招了。C++引入

typedef用法详解

引子: 请讲讲这道题怎么做呢及其相关结构体定义的问题十分感谢 以下结构体类型说明和变量定义中正确的是 A)typedef struct B)struct REC; { int n; char c;}REC; { int n; char c;}; REC t1,t2; REC t1,t2; C)typedef struct REC; D)struct { int n=0; char c='A';}t1,t2; { int n; char c;}REC; REC t1,t2; 可以详细的解释一下这道题吗?其他的错在哪里了呢 十分感谢 我见过这样的题,没看懂你的意思,不过我看这样说吧, struct a {... }B; 我打。。。的地方表示你可以在那里添加所有的数据形式的定义,比如,int a;char a[10];等等; 而B表示变量名。就如同int a的a一样,只是一个变量标示符,他就是一个结构体变量了。当你使用typedef使,它表示的是枚举类型,功能如同宏定义一样, 使用他的时候方法如下: 首先写出你要表示的变量类型。列如:int a;然后在int的前面加上typedef, typedef int a;然后把变量名a 改变成你要使用的表示符如 pp; 现在就变成 typedef int pp; 当你要在定义其他的变量是int型的时候,你就可以这样定义了 pp b; 这里的b就是变量名了。注意枚举类型它并不产生新的变量类型,只是一种替代作用。我在给你举个列子吧typedef struct a{ int s; char p[10]; } num; num n; 这时候n就是 struct a 类型的结构体变量了。不知道你懂没有。。。 C语言中typedef用法 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。 至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。 2. typedef & 结构的问题 当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明: typedef struct tagNode { char *pItem; pNode pNext; } *pNode;

C语言typedef用法总结

C语言typedef用法总结 黄海涛,2012-3-11 C语言中的typedef可以让人感觉很清新,但也可以让人感觉神秘。当你一层层剥开它的时候,神秘的面纱终会摘下…… 让我们一起来探究其中的秘密吧! 一、概述 1、类型定义符typedef C语言提供了一个称为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、缺点 允许一些看上去混乱的语法,可以把几个声明放在一个声明中。如:

type的用法

1. 常规变量类型定义 例如:typedef unsigned char uchar 描述:uchar等价于unsigned char类型定义uchar c声明等于unsigned char c声明 2.数组类型定义 例如:typedef int array[2]; 描述:array等价于int [2]定义; array a声明等价于int a[2]声明 扩展:typedef int array[M][N]; 描述:array等价于int [M][N]定义; array a声明等价于int a[M][N]声明 3.指针类型定义 例如:typedef int *pointer; 描述:pointer等价于int *定义;pointer p声明等价于int *a声明 例如:typedef int *pointer[M]; 描述:pointer等价于int *[M]定义pointer p声明等价于int *a[M]声明明 4.函数地址说明 描述:C把函数名字当做函数的首地址来对待,我们可以使用最简单的方法得到函数地址 例如:函数:int func(void); unsigned long funcAddr=(unsigned long)func,funcAddr 的值是func函数的首地址 5.函数声明 例如:typedef int func(void); func等价于int (void)类型函数 描述1:func f声明等价于int f(void)声明,用于文件的函数声明 描述2:func *pf声明等价于int (*pf)(void)声明,用于函数指针的生命,见下一条 6.函数指针 例如:typedef int (*func)(void) 描述:func等价于int (*)(void)类型 func pf等价于int (*pf)(void)声明,pf是一个函数指针变量 7.识别typedef的方法: a).第一步。使用已知的类型定义替代typdef后面的名称,直到只剩下一个名字不识别为 正确 如typedef u32 (*func)(u8); 从上面的定义中找到typedef __u32 u32;typedef __u8 u8 继续找到typedef unsigned int __u32;typedef unsigned char __u8; 替代位置名称typedef unsigned int (*func)(void); 现在只有func属于未知。 b).第二步.未知名字为定义类型,类型为取出名称和typedef的所有部分,如上为 func等价于unsigned unsigned int (*)(unsigned char);

Origin 使用问题集锦

1. 请教怎样反读出origin曲线上全部数据点? 如,我用10个数据点画出了一条origin曲线,并存为project的.OPJ格式。 但,现在我想利用OPJ文件从这条曲线上均匀的取出100个数据点的数值,该如何做?注:要一切都使用origin软件完成,不用其他曲线识别软件。 https://www.wendangku.net/doc/1e391324.html,/bbs/viewthread.php?tid=1390313 Answer: ORIGIN中,在分析菜单(或统计菜单)中有插值命令,打开设置对话框,输入数据的起点和终点以及插值点的个数,OK!生成新的插值曲线和对应的数据表格。 2. origin中非线性拟合中logistic模型的疑问? origin 中非线性拟合中的logistic模型为 y = A2 + (A1-A2)/(1 + (x/x0)^p) 其初始参数设置为 sort(x_y_curve); //smooth(x_y_curve, 2); x0 = xaty50( x_y_curve ); p = 3.0; if( yatxmin( x_y_curve ) > yatxmax( x_y_curve ) ) { A1 = max( y_data ); A2 = min( y_data ); } else { A1 = min( y_data ); A2 = max( y_data ); } 而据我看到的logistic的模型都是(自己origin中自定义的) y =A1/(1+(A1/A2-1)*exp(-k*x)) 也就是说origin 中的logistic有4个数值需要确定,而自定义的有3个数值 从结果来看,没有太大区别,但为什么函数不一样呢? 不是学数学,高人能否详细说明下。 https://www.wendangku.net/doc/1e391324.html,/bbs/viewthread.php?tid=1391522 Answer: 你可以看一下这个文档,里面有数种不同形式的logistic 模型: https://www.wendangku.net/doc/1e391324.html,/web/packages/drc/drc.pdf 当然,这是一个R (https://www.wendangku.net/doc/1e391324.html,) 包的文档,但不妨碍你看其中的公式。 R 是开源的啊,以GPL 发布,可以从https://www.wendangku.net/doc/1e391324.html,上了解更多。

#define 用法大全

#define用法集锦[修正版] Definition[定义]: The #define Directive You can use the #define directive to give a meaningful name to a constant in your program. The two forms of the syntax are: Syntax #define identifier token-stringopt #define identifier[( identifieropt, ... , identifieropt )] token-stringopt Usage[用法]: 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME 就定义好了,它代表1000,如果在程序里面写 if(i(y)?(x):(y); 这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。 但是这样做的话存在隐患,例子如下: #define Add(a,b) a+b; 在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d 的时候就会出现问题,代数式的本意是a+b 然后去和c,d 相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了c*a + b*d 另外举一个例子: #define pin (int*); pin a,b; 本意是a 和b 都是int 型指针,但是实际上变成int* a,b; a 是int 型指针,而 b 是int 型变量。 这是应该使用typedef 来代替define,这样a 和b 就都是int 型指针了。

c语言关键字的用法详解

1. Static用法 1.1 static声明的变量在C语言中有两方面的特征: 1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 1.2 特点 A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度; C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题; D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数) E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static 的局部变量的地址作为返回值,若为auto类型,则返回为错指针。 函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。 扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。 1.3 关键字static的作用是什么? 这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:

typedef的用法

typedef的语法规则其实很简单,一句话来说就是定义对象的语法前加关键字typedef,剩下的不变,原本定义的对象标识符换成类型标识符,对应语义从定义一个对象改成定义一个类型别名。typedef看起来复杂根本原因是对象定义的语法比较复杂,例如分隔符*和[]的用法。 typedef struct node{ datatype data; struct node *lchild,*rchild; }bintnode; 对应的对象定义: struct node{ datatype data; struct node *lchild,*rchild; }bintnode; 去除bintnode来看就是一个类型struct node的完整描述。加上了bintnode来看,表示定义了一个struct node类型的对象bintnode。 现在前面有typedef,因此这个bintnode不是对象名而是类型名。也就是定义了一个类型别名bitnode,实际上指的就是struct node这个完整类型。 typedef定义的类型别名在作用域内和被定义的原类型语义上等价,都是表示同一个类型的名称。这里typedef之后bitnode可以和struct node互相代替(注意在C++中,如果同一命名空间内类型名和对象名没有重复,那么struct可以省略,struct node等价于node)。 更复杂一点的: struct node{ datatype data; struct node *lchild,*rchild; }bintnode, *bintree; 注意定义对象时*修饰对象本身而不是修饰类型。因此这里定义了struct node对象bintnode和struct node*类型的对象bintree。 对应的类型定义: struct node{ datatype data; struct node *lchild,*rchild; }bintnode, *bintree; 这里定义了类型别名bintnode表示完整类型struct node,以及bintree表示类型struct node*。 拆开来就成了 typedef struct node{ datatype data; struct node *lchild,*rchild; }bintnode; typedef bintnode *bintree; 这种写法看起来应该稍微清楚了一点。 至于下面的cirqueue,和上面的bintnode类似,只是这里省略了结构体名称,是一个匿名类型。这样写的主要好处是类型名可以省略struct(C++里面不这样写也可以省略)。

typedef struct 用法详解和用法小结

1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。 至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。 2. typedef& 结构的问题 当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明: typedefstructtagNode { char *pItem; pNodepNext; } *pNode; 答案与分析: 1、typedef的最简单使用 typedef long byte_4; 给已知数据类型long起个新名字,叫byte_4。 2、 typedef与结构结合使用 typedefstructtagMyStruct { intiNum; long lLength; } MyStruct; 这语句实际上完成两个操作: 1) 定义一个新的结构类型 structtagMyStruct { intiNum; long lLength; };

分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。 我们可以用structtagMyStructvarName来定义变量,但要注意,使用tagMyStructvarName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。 2) typedef为这个新的结构起了一个名字,叫MyStruct。 typedefstructtagMyStructMyStruct; 因此,MyStruct实际上相当于structtagMyStruct,我们可以使用MyStructvarName来定义变量。 答案与分析 C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。 根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。 解决这个问题的方法有多种: 1)、 typedefstructtagNode { char *pItem; structtagNode *pNext; } *pNode; 2)、 typedefstructtagNode *pNode; structtagNode { char *pItem; pNodepNext; }; 注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。

enum与typedef enum的用法

在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是: #define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI 5 #define SAT 6 #define SUN 7 在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。 1. 定义一种新的数据类型 - 枚举型 以下代码定义了这种新的数据类型 - 枚举型 enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; (1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。 (2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。 (3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。 (4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。 (5) 枚举型是预处理指令#define的替代。 (6) 类型定义以分号;结束。 2. 使用枚举类型对变量进行声明 新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float, 双精度浮点型double, 字符型char, 短整型short等等。用这些基本数据类型声明变量通常是这样: char a; //变量a的类型均为字符型char char letter; int x, y, z; //变量x,y和z的类型均为整型int int number; double m, n; double result; //变量result的类型为双精度浮点型double 既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。

origin使用常见问题

1. 请教怎样反读出origin 曲线上全部数据点? 如,我用10个数据点画出了一条origin 曲线,并存为project的.OPJ 格式。但,现在我想利用OPJ 文件从这条曲线上均匀的取出100个数据点的数值,该如何做?注:要一切都使用origin 软件完成,不用其他曲线识别软件。 Answer: ORIGIN 中,在分析菜单(或统计菜单)中有插值命令,打开设置对话框,输入数据的起点和终点以及插值点的个数,OK!生成新的插值曲线和对应的数据表格。 2. 如何用origin 做出附件中的图: 其中标注的三角形、方块是怎么整上去的? Answer: 选中左侧竖工具条中的draw tool(显示是几个点,第七个工具),移动到你要标注的位置双击,就产生了一个点,依次标注完方块。再标注三角的第一个点,标注完后改成三角,以后标注的就都是三角了。改动点的类型的方法和正常画曲线方式一样。 3. 如何用origin 做出附件图中的坐标轴(带刻度)?

Answer: 你把刻度改成那样不就行了。 8.0 的具体方法是双击坐标轴,title & format --> 选左边那个bottom,然后在右边把axis 改为at position=。同理,然后选左边的left,把axis也改为at position=。 4. origin能否读取导入曲线的坐标? 一张bmp 格式的图片,图片内容是坐标系和拟合曲线,但是不知道用什么软件绘制的。请问能否将该图片导入origin,读出曲线上任意一点的数据? Answer: (1). 1.ORIGIN 有一个图形数字化插件可完成该任务。2.有许多专门的图形数字化软件也可完成此任务。个人感觉专门的比插件也用、便捷。推荐WINDIG25 (2). origin下的数字化插件是digitizer,下载地址:https://www.wendangku.net/doc/1e391324.html,/fileexchange/details.aspx?fid=8拖入origin即可,但使用不是很方便。比较方便的是un-scan-it。 5. 如何在origin7.5 中标峰值? 用origin7.5 作的XRD图,怎样直接在峰上标数据? Answer: Tools/Pick peaks 设置一下点击Find Peaks 就OK了。Positive和Negative 是标正负峰值的意思,其他数值改变一下就知道干吗用的了。 6. 关于origin 拟合曲线延长的问题? 我想把拟合之后的直线向前或向后延长一段距离与坐标轴相交。但是不知道该怎么弄。是不是要改那个范围的最大值和最小值啊?可是怎么改? Answer: (1). 有那个选项,你可以选择延长布满坐标轴,大概这么翻译吧,我也翻译不好。在analysis里呢,找找,我的卸载了。。。。 (2). 自己按照方程作图,就是先在一定范围内选一系列点`,然后求出对应的y,然后做曲线图把点连起来。 (3). 拟合之前在设定参数的时候就把坐标范围设定好,拟合出来的曲线就是你要的范围的。拟合好以后的曲线好像是不能修改参数的,只有重新拟合才行。 7. 我用origin 画的图,过了一段时间,不知道怎么的,就只有图,看不到数据窗口了,怎么能把数据窗口调出来呢? Answer: Veiw---project explorer;或者Alt+1。如果你是从拷贝的图进去,是看不到数据框的啊!所以建议要保存原始的图谱啊!

相关文档