C语言中#define与typedef的互换细节详解

2016-02-19 09:07 6 1 收藏

图老师小编精心整理的C语言中#define与typedef的互换细节详解希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

【 tulaoshi.com - 编程语言 】

代码如下:

#include stdio.h
/*---------           #define    string    char *            ----*/
typedef   char *   string;      

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

int main(void)
{
   string   a[] = {"I", "like", "to", "fight,"},
   b[] = {"pinch,", "and", "bight."};
   printf("%s %s %s %s %s %s %sn", a[0], a[1], a[2], a[3], b[0], b[1], b[2]);
   return 0;
}

用#define替换掉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语句必须写成 pStr2 s3, *s4; 这这样才能正常执行。

所以程序
代码如下:

#define    string    char *;       
int main(void)
{
   string   a[] = {"I", "like", "to", "fight,"},
   *b[] = {"pinch,", "and", "bight."};   /*--就是这里!!--*/
   printf("%s %s %s %s %s %s %sn", a[0], a[1], a[2], a[3], b[0], b[1], b[2]);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

   return 0;
}

==========================
确实很巧妙!

来源:http://www.tulaoshi.com/n/20160219/1589593.html

延伸阅读
一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型 sizeof使用形式:sizeof(type) 数据类型...
自己总结的,觉得能帮助初学者看透一些纷繁复杂的语法规则,理解C语言的真谛 第一次发布,不一定正确,欢迎讨论、指正、补充 1. 表达式定律 !-- frame contents -- !-- /frame contents -- 任何能产生数值结果的运算、操作都可以作为表达式,并可以放到任何需要数值结果的地方,只要数值类型能...
基于对象的程序设计的好处大家应该都有一定的体会,但是在 C 语言中并不支持类的概念,不过我们可以通过 strUCt 实现一些基础的类对象,如队列、堆栈等。通过对象的实现可以在一定程度上提高编程效率、简化 C程序设计。下面使用一个例子来介绍下如何在实现一个简单的类,希望对大家有些益处: /* 应用消息队列类 */ struct Ap...
大师级经典的著作,要字斟句酌的去读,去理解。以前在看K&R的The C Programming Language(SecondEdition) 第1.5节的字符输入/输出,被getchar()和EOF所迷惑了。可能主要还是由于没有搞清楚getchar()的工作原理和EOF的用法。因此,感觉很有必要总结一下,不然,很多琐碎的知识点长时间过后就会淡忘的,只有写下来才是最好的方法。 其实,getchar...
#define ASPECT_RATIO 1.653 编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息指的是1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO不是在你自己写的头文件中定义的,你就会奇怪1.65...

经验教程

896

收藏

78
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部