C C++中typedef struct和struct的用法

上传人:ta****u 文档编号:185300300 上传时间:2023-02-03 格式:DOCX 页数:14 大小:33.61KB
收藏 版权申诉 举报 下载
C C++中typedef struct和struct的用法_第1页
第1页 / 共14页
C C++中typedef struct和struct的用法_第2页
第2页 / 共14页
C C++中typedef struct和struct的用法_第3页
第3页 / 共14页
资源描述:

《C C++中typedef struct和struct的用法》由会员分享,可在线阅读,更多相关《C C++中typedef struct和struct的用法(14页珍藏版)》请在装配图网上搜索。

1、1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 由于对typedef理解不够,因此从网上摘录了一些资料,整理如下: C/C++中 typedef struct 和 struct 的用法 struct _x1 { ...}x1;和 typede

2、f struct _x2{ ...} x2;有什么不同? 其实,前者是定义了类_X1和_x1的对象实例x1,后者是定义了类_x2和_x2的类别名x2 , 所以它们在使用过程中是有取别的.请看实例1. [知识点] 结构也是一种数据类型,可以使用结构变量,因此,象其它类型的变量一样,在使用结构变 量时要先对其定义。 定义结构变量的一般格式为: struct结构名 { 类型变量名; 类型变量名; }结构变量; 结构名是结构的标识符不是变量名。 另一种常用格式为: typedef struct 结构名 { 类型变量名; 44. 45. 46. 47. 48.

3、49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 类型变量名; }结构别名; 另外注意:在C中,st rue t不能包含函数。在C++中,对st ruct进行了扩展,可以包含函数。 实例 1: struct, epp #include u

4、sing namespace std; typedef struct _point{ int x; int y; }poin t; //定义类,给类一个别名 struct _hello{ int x,y; } hello; //同时定义类和对象 int main() { point pt1; pt1.x = 2; pt 1.y = 5; cout<< "ptpt1.x=" << pt1.x << "pt.y=" <, —个有同样接口的函数。 typedef 和存储类关键字(storage class specifier) 365. 329. 这种说法是不是有点令人惊讶,typedef就像au to, ex tern, mut able, stat ic, 和register —样,是一个存储类关键字。这并是说typedef会真正影响对

23、象的存储特性;它只 是说在语句构成上,typedef声明看起来象static, extern等类型的变量声明。下面将带到第 二个陷阱:typedef register int FAST_COUNTER; // 错误 367. 330. 编译通不过。问题出在你不能在声明中有多个存储类关键字。因为符号typedef已经占据 了存储类关键字的位置,在typedef声明中不能用register (或任何其它存储类关键字)。促 进跨平台开发 369. 331. typedef有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个 叫REAL的浮点类型,在目标机器上它可以i获得最高的

24、精度:typedef long double REAL; 371. 332. 在不支持long double的机器上,该typedef看起来会是下面这样: typedef double REAL; 373. 333. 并且,在连double都不支持的机器上,该typedef看起来会是这样:、 typedef float REAL; 375. 334. 你不用对源代码做任何修改,便可以在每一种平台上编译这个使用REAL类型的应用程序。 唯一要改的是typedef本身。在大多数情况下,甚至这个微小的变动完全都可以通过奇妙的条件 编译来自动实现。不是吗?标准库广泛地使用typedef

25、来创建这样的平台无关类型:size_t, ptrdiff和fpos_t就是其中的例子。此外,象std::string和std::ofstream这样 的typedef还隐藏了长长的,难以理解的模板特化语法,例如: basic_string, allocator> 和 basic_ofstream>。 377. 378. 379. 380. 381. 335. typedef & #define的问题 有下面两种定义pStr数据类型的方法,两者有什么不同?哪 一种更好一

26、点? typedef char *pStr; 383. 336. #define pStr char *; 385. 337. 答案与分析: 387. 338. 通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子: typedef char *pStr1; 389. 339. #define pStr2 char *; 391. 340. pStrl s1, s2; 393. 341. pStr2 s3, s4; 395. 342. 在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了 char,不是我们 所预期

27、的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起 新名字。 #define 用法例子:#define f(x) x*x 397. 343. main() 399. 344. { 401. 345. int a=6, b=2, c; 403. 346. c=f(a) / f(b); 405. 347. printf("%d \\n", c); 407. 348. } 409. 349. 以下程序的输出结果是:36。 411. 350. 因为如此原因,在许多C语言编程规范中提到使用#define定义时,如果定义中包含表达式

28、, 必须使用括号,则上述定义应该如下定义才对:#define f(x) (x*x) 当然,如果你使用 typedef就没有这样的问题。 413. 351. 4. typedef & #define的另一例 下面的代码中编译器会报一个错误,你知道是哪个语 句错了吗? 415. 352. typedef char * pStr; 417. 353. char string[4] = "abc"; 419. 354. const char *p1 = string; 421. 355. const pStr p2 = string; 423. 356. p1++; 4

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

30、1. 360. 1) #define宏定义有一个特别的长处:可以使用#ifdef ,#ifndef等来进行逻辑判断, 还可以使用#undef来取消定义。 433. 361. 2) typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用 范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。 435. 362. 5. typedef &复杂的变量声明 437. 363. 在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef 作简化自有其价值,比如: 439. 364. 下面是三个变

31、量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做? >1: int *(*a[5])(int, char*); 441. 365. >2: void (*b[10]) (void (*)()); 443. 366. >3. doube(*)() (*pa)[9]; 445. 367. 答案与分析: 对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表 达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。>1: int *(*a[5])(int, char*); 447. 368. //pFun是我们建的一个类型别名 4

32、49. 369. typedef int *(*pFun)(int, char*); 451. 370. //使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*); 453. 371. pFun a[5];>2: void (*b[10]) (void (*)()); 455. 372. 〃首先为上面表达式蓝色部分声明一个新类型 457. 373. typedef void (*pFunParam)(); 459. 374. //整体声明一个新类型 461. 375. typedef void (*pFun)(pFunParam); 4

33、63. 376. //使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)()); 465. 377. pFun b[10];>3. doube(*)() (*pa)[9]; 467. 378. 〃首先为上面表达式蓝色部分声明一个新类型 469. 379. typedef double(*pFun)(); 471. 380. //整体声明一个新类型 473. 381. typedef pFun (*pFunParam)[9]; 475. 382. //使用定义的新类型来声明对象,等价于doube(*)() (*pa)[9]; 477. 383. pFunParam pa;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  sobing.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!