




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1)字符串常量与字符常量的区别:常量就是固定不变的量,不能通过函数进行修改的变量;变量是可以通过赋值,函数等手段进行修改的一个变量。 字符串常量:char *a = hello world;首先,操作系统在编译器规划内存方案中的的文字常量区分配一段内存,存储hello world字符串,然后在栈区分配一个内存,存储hello world字符串所在内存的首地址,字符串常量一旦分配是不允许修改的。字符常量:char b = hello world;操作系统在编译器规划的内存方案中的栈区分配一段连续内存空间(12个字节),存储hello world字符串,字符串常量就相当于字符的一个数组,是可以修改的。2)typedef和#define的区别:1. 基本解释typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。2. typedef & 结构的问题当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明:typedef struct tagNodechar *pItem;pNode pNext; *pNode;答案与分析:1、typedef的最简单使用typedef long byte_4;给已知数据类型long起个新名字,叫byte_4。2、 typedef与结构结合使用typedef struct tagMyStructint iNum;long lLength; MyStruct;这语句实际上完成两个操作:1) 定义一个新的结构类型struct tagMyStructint iNum;long lLength;分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。2) typedef为这个新的结构起了一个名字,叫MyStruct。typedef struct tagMyStruct MyStruct;因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。答案与分析C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。解决这个问题的方法有多种:1)、typedef struct tagNodechar *pItem;struct tagNode *pNext; *pNode;2)、typedef struct tagNode *pNode;struct tagNodechar *pItem;pNode pNext;注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。3)、规范做法:struct tagNodechar *pItem;struct tagNode *pNext;typedef struct tagNode *pNode;3. typedef & #define的问题有下面两种定义pStr数据类型的方法,两者有什么不同?哪一种更好一点?typedef char *pStr;#define pStr char *;答案与分析:通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子:typedef char *pStr1;#define pStr2 char *;pStr1 s1, s2;pStr2 s3, s4;在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。#define用法例子:#define f(x) x*xmain( )int a=6,b=2,c;c=f(a) / f(b);printf(%d ,c);以下程序的输出结果是: 36。因为如此原因,在许多C语言编程规范中提到使用#define定义时,如果定义中包含表达式,必须使用括号,则上述定义应该如下定义才对:#define f(x) (x*x)当然,如果你使用typedef就没有这样的问题。4. typedef & #define的另一例下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?typedef char * pStr;char string4 = abc;const char *p1 = string;const pStr p2 = string;p1+;p2+;答案与分析:是p2+出错了。这个问题再一次提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和const long x本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数据类型为char *的变量p2为只读,因此p2+错误。(注:关于const的限定内容问题,在本系列第二篇有详细讲解)。#define与typedef引申谈1) #define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。2) typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。5. typedef & 复杂的变量声明在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?1:int *(*a5)(int, char*);2:void (*b10) (void (*)();3. doube(*)() (*pa)9;答案与分析:对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。(注:如果你对有些变量的声明语法感到难以理解,请参阅本系列第十篇的相关内容)。1:int *(*a5)(int, char*);/pFun是我们建的一个类型别名typedef int *(*pFun)(int, char*);/使用定义的新类型来声明对象,等价于int* (*a5)(int, char*);pFun a5;2:void (*b10) (void (*)();/首先为上面表达式蓝色部分声明一个新类型typedef void (*pFunParam)();/整体声明一个新类型typedef void (*pFun)(pFunParam);/使用定义的新类型来声明对象,等价于void (*b10) (void (*)();pFun b10;3. doube(*)() (*pa)9;/首先为上面表达式蓝色部分声明一个新类型typedef double(*pFun)();/整体声明一个新类型typedef pFun (*pFunParam)9;/使用定义的新类型来声明对象,等价于doube(*)() (*pa)9;pFunParam pa;/第1篇:typedef语句格式#includetypedef int GTYPE;/定义全局类型GTYPEvoid main()/一、基本格式typedef char CH;/重定义基本类型typedef structint a,b,c;STRU;/重定义自定义类型(结构、共用、枚举)typedef unionint a,b,c;UNIO;typedef enumone,two,threeNUM;typedef char* STR;/重定义派生类型(指针、数组、函数)typedef int AI10;typedef void FUN(void);/可见,typedef使用的格式为:typedef 变量/函数定义语句;即在原变量/函数定义语句的开头加上/typedef,便可将原变量/函数定义语句改写为类型定义语句,原来定义的变量名/函数名都成了类型名。/注:当重定义基本、自定义类型时,格式也可总结为:typedef 原类型 新类型1,新类型2,;/二、观察原类型/1.原类型可以带有类型限定符typedef const int CI;/原类型含const限定符CI ci=3;/ci=4;/可见CI确实代表const int/2.原类型可以是typedef定义的新类型typedef CH NEWCH;/CH已在前面定义为charNEWCH nc=a;/3.原类型不可带有存储类别/typedef static int SI;/错误,指定的存储类多于1个/typedef register int RI;/错误同上/4.原类型应是一种类型,而不可是变量/对象float f=0;/将f定义为变量/typedef f FL;/错误/5.不宜重定义的类型typedef const CON;/重定义const/CON int a=0;/但该类型无法正常使用typedef unsigned US;/重定义unsignedUS us1=0;/正确,相当于unsigned int/US int us2;/错误,无法正常使用/注:因const、unsigned等并不是一种独立的类型,故不便对它们重定义/三、观察新类型/1.新类型的作用域typedef int LTYPE;/定义局部类型LTYPEvoid fun();/观察LTYPE在fun中是否有效fun();/可见,用typedef定义的类型也有作用域之分。在函数内用typedef定义的是局部类型/typedef也可以像变量定义语句一样放置在函数之外,这时定义的是全局类型/2.新类型可否是已有类型/typedef int float;/错误,不能重定义标准类型typedef int TYPE; /定义了新类型TYPE/typedef char TYPE;/错误,TYPE重定义typedef int GTYPE;/正确,尽管GTYPE是已有类型,但它是本函数外定义的/可见,新类型名必须是合法的标识符,它在其作用域内必须是唯一的/3.新类型可否不止一个typedef float LENGTH,WIDTH;/对float取两个别名,LENGTH和WIDTHLENGTH L=0;/用新类型定义变量WIDTH W=0;/可见,可以一次性为某个原类型指定多个别名/4.一次可否定义多个不同类型/typedef int I,float F;/一次定义了二个不同类型I和F/F v=6.0;/试图使用F类型/printf(v=%f ,v);/v=0,类型F无效/可见,一条typedef语句只宜为一个原类型定义别名void fun() /LTYPE i;/错误,LTYPE:未定义的标识符GTYPE g=1;/使用全局类型GTYPEprintf(g=%d ,g);/正常使用/第2篇:typedef详细使用#include#includevoid main()/一、重定义基本类型/1.定义typedef int in;typedef char ch;typedef float fl;typedef double db;typedef unsigned int ui;/或写为typedef unsigned ui;typedef unsigned char uc;typedef void vo;/2.使用in i=3;printf(i=%d ,i); /用新类型定义变量ch* pc=pc;printf(pc=%s ,pc);/用新类型定义指针fl af3=1,2,3;printf(af0=%f ,af0);/用新类型定义数组static double sd;printf(sd=%f ,sd);/用新类型定义带存储类别的变量const ui cui=3;printf(cui=%d ,cui);/用新类型定义带类型限定符的变量vo fun1(uc);fun1(a);/用新类型作函数的参数和返回值类型printf(in(1.5)=%d ,in(1.5);/将新类型用作类型转换printf($db=%d ,sizeof(db);/对新类型求长度,$db=$double=8/二、重定义自定义类型/1.定义/(1)完整写法(先定义好自定义类型,再重定义它)struct datetype /重定义结构类型 ui year;/ui即是unsigned int;uc month;/uc即是unsigned char;uc day;typedef datetype date;union scoretype /重定义共用类型 fl sco1;ch* sco2;typedef scoretype score;enum numtypeone,two,three; /重定义枚举类型typedef numtype num;typedef num newnum; /重定义typedef类型/(2)通常写法(对无类型名的结构、共用、枚举定义语句直接重定义)typedef structuc hou,min,sec; time;typedef unionfl sco1;ch* sco2; sco;typedef enumred,green,blue color;/可见,无论何种写法,都遵循typedef语句的格式:typedef 原类型 新类型;/2.使用date vs=2002,10,15;/定义结构变量printf(vs:%d.%d.%d ,vs.year,vs.month,vs.day);score vu,*pu=&vu;printf(&vu=%x pu=%x ,&vu,pu);/定义共用指针newnum ae3=one,two,three;/定义枚举数组printf(ae0=%d ae1=%d ae2=%d ,ae0,ae1,ae2);static num vn;/定义带存储类别的对象printf(vn=%d ,vn);const sco cs=90;/定义const对象printf(cs.sco1=%f ,cs.sco1);time fun2(time);/作函数的参数和返回值类型static time vt=fun2(vt);printf(fun2:%d:%d:%d ,vt.hou,vt.min,vt.sec);vn=(num)10;printf(vn=%d ,vn);/将新类型用作类型转换printf($time=%d ,sizeof(time);/对新类型求长度,$time=3printf($sco=%d ,sizeof(sco);/对新类型求长度,$sco=4printf($color=%d ,sizeof(color);/对新类型求长度,$color=4/第3篇:typedef具体应用#includeint fun1(int a,int b)return 0;int fun2(int a,int b)return 0;int fun3(int a,int b)return 0;void main() /一、使用typedef的优点/1可以为现有类型取一个更有意义的名字,增加程序的可读性,如typedef char* STRING;STRING s1=string1,s2=string2;/STRING便可当作字符串类型来使用/2使变量定义更简短,减少书写麻烦,如typedef float A3234;/为2*3*4的实型数组取简短的名字A3A3 a,b,c;/相当于定义float a234,b234,c234typedef unsigned int(*PFUN)(int(*)4);/PFUN是一种函数指针,该类函数参数为一维数组型指针,返回值为无符号整型PFUN pf1,pf2;/相当于定义unsigned int(*pf1)(int(*)4);unsigned int(*pf2)(int(*)4)/3在定义复杂类型前,先用typedef建立一些中间类型,再用中间类型去构造复杂类型,以降低其复杂性(主要用途)/例:对于如下的复杂定义int(*ap3)(int,int);/ap是一个数组,其元素为函数型指针,该类函数的参数和返回值都是整型/采用typedef以降低定义难度/方法1typedef int(*PF)(int,int);/定义PF为该种函数的指针PF ap13;/ap1为一数组,每个元素都是PF类型ap10=fun1;ap11=fun2;ap12=fun3;/方法2typedef int FUN(int,int);/将该种函数定义为FUN类型FUN* ap23;/ap2为一数组,每个元素都是指向FUN的指针ap20=fun1;ap21=fun2;ap22=fun3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年麻醉学专业知识检测考试卷答案及解析
- 2025年傣医云南疾病诊治技能检测答案及解析
- 2025年围手术期安全管理手术风险评估答案及解析
- 2025年妇产科妊娠并发症处理技巧考核答案及解析
- 2025年疼痛科学诊疗技巧考核答案及解析
- 2025年药物治疗常见副作用考核试题模拟卷答案及解析
- 2025年骨科学术研究与临床应用综合考试答案及解析
- 2025年外科创伤患者的急救处理模拟测试卷答案及解析
- 2025年精神科学抑郁症患者自杀风险评估模拟考试试卷答案及解析
- 2025年产科操作技能培训测验答案及解析
- 2025年山东高考真题化学试题(原卷版)
- 第2课 教师节快乐 第2课时(课件)2025-2026学年道德与法治二年级上册统编版
- 2025年福建省福州市辅警考试题库(附答案)
- 2025秋新部编版一年级上册语文教学计划+教学进度表
- 大学英语四级高频词汇1500+六级高频词汇1500
- 诊所备案申请表格(卫健委备案)
- LANTEK兰特钣金软件手册(下)
- 测井曲线综合解释(课堂PPT)
- 贮水花盆案例总结-2015天津中心修改
- DB37_T 4496-2022 水工混凝土表面涂层质量检测技术规程
- 矿井通风与防尘
评论
0/150
提交评论