文档库 最新最全的文档下载
当前位置:文档库 › typedef详解

typedef详解

typedef详解
typedef详解

C语言typedef的用法

一.基本概念剖析

int* (*a[5])(int, char*); //#1

void (*b[10]) (void (*)()); //#2

double(*)() (*pa)[9]; //#3

1.C语言中函数声明和数组声明。函数声明一般是这样:

int fun(int, double);

对应函数指针(pointer to function)的声明是这样:

int (*pf)(int, double);

可以这样使用:

pf = &fun; //赋值(assignment)操作

(*pf)(5, 8.9);//函数调用操作

也请注意,C语言本身提供了一种简写方式如下:

pf = fun; // 赋值(assignment)操作

pf(5, 8.9); // 函数调用操作

不过我本人不是很喜欢这种简写,它对初学者带来了比较多的迷惑。

数组声明一般是这样:

int a[5];

对于数组指针(pointer to array)的声明是这样:

int (*pa)[5];

可以这样使用:

pa = &a;// 赋值(assignment)操作

int i = (*pa)[2];// 将a[2]赋值给i;

2.有了上面的基础,我们就可以对付开头的三只纸老虎了!:)这个时候你需要复习一下各种运算符的优先顺序和结合顺序了,顺便找本书看看就够了。

#1:int* (*a[5])(int, char*);

首先看到标识符名a,“[]”优先级大于“*”,a与“[5]”先结合。所以a是一个数组,这个数组有5个元素,每一个元素都是一个指针,

指针指向“(int, char*)”,对,指向一个函数,函数参数是“int, char*”,返回值是“int*”。完毕,我们干掉了第一个纸老虎。:)

#2:void (*b[10]) (void (*)());

b是一个数组,这个数组有10个元素,每一个元素都是一个指针,指针指向一个函数,函数参数是“void (*)()”【注1】,返回值是“void”。完毕!

注1:这个参数又是一个指针,指向一个函数,函数参数为空,返回值是“void”。

#3:double(*)()(*pa)[9];

pa是一个指针,指针指向一个数组,这个数组有9个元素,每一个元素都是“double(*)()”【也即一个指针,指向一个函数,函数参数为空,返回值是“double

---------------------------------------------------------------

#1:int* (*a[5])(int, char*);

typedef int* (*PF)(int, char*);//PF是一个类型别名【注2】。

PF a[5];//跟int* (*a[5])(int, char*);的效果一样!

注2:很多初学者只知道typedef char* pchar;但是对于typedef的其它用法不太了解。Stephen Blaha

对typedef用法做过一个总结:“建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头”。

#2:void (*b[10])(void (*)());

typedef void (*pfv)();

typedef void (*pf_taking_pfv)(pfv);

pf_taking_pfv b[10]; //跟void (*b[10]) (void (*)());的效果一样!

#3. double(*)()(*pa)[9];

typedef double(*PF)();

typedef PF (*PA)[9];

PA pa; //跟doube(*)()(*pa)[9];的效果一样!

3.const和volatile在类型声明中的位置。

在这里我只说const,volatile是一样的!【注3】

注3:顾名思义,volatile修饰的量就是很容易变化,不稳定的量,它可能被其它线程,操作系统,硬件等等在未知的时间改变,

所以它被存储在内存中,每次取用它的时候都只能在内存中去读取,它不能被编译器优化放在内部寄存器中。

类型声明中const用来修饰一个常量,我们一般这样使用:const在前面:

const int;//int是const

const char*;//char是const

char* const;//*(指针)是const

const char* const;//char和*都是const

对初学者,const char*和char* const是容易混淆的。这需要时间的历练让你习惯它。上面的声明有一个对等的写法:const在后面:

int const;//int是const

char const*;//char是const

char* const;//*(指针)是const

char const* const;//char和*都是const

第一次你可能不会习惯,但新事物如果是好的,我们为什么要拒绝它呢?:)const在后面有两个好处:A.const所修饰的类型正好是在它前面的那一个。如果这个好处还不能让你动心的话,那请看下一个!B.我们很多时候会用到typedef的类型别名定义。比如typedef char* pchar,如果用const来修饰的话,

当const在前面的时候,就是const pchar,你会以为它就是const char* ,但是你错了,它的真实含义是char* const。

是不是让你大吃一惊!但如果你采用const在后面的写法,意义就怎么也不会变,不信你试试!

不过,在真实项目中的命名一致性更重要。你应该在两种情况下都能适应,并能自如的转换,公司习惯,商业利润不论在什么时候都应该优先考虑!不过在开始一个新项目的时候,你可以考虑优先使用const在后面的习惯用法。

二.Typedef声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法。

不管怎样,使用typedef 能为代码带来意想不到的好处,通过本文你可以学习用typedef避免缺欠,从而使代码更健壮。

typedef声明,简称typedef,为现有类型创建一个新的名字。比如人们常常使用typedef 来编写更美观和可读的代码。

所谓美观,意指typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。

本文下面将竭尽全力来揭示typedef 强大功能以及如何避免一些常见的陷阱,如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法.

typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于typedef关键字右边。

例如:typedef int size;

此声明定义了一个int 的同义字,名字为size。注意typedef并不创建新的类型。它仅仅为现有类型添加一个同义字。

你可以在任何需要int 的上下文中使用size:

void measure(size * psz);

size array[4];

size len = file.getlength();

typedef 还可以掩饰复合类型,如指针和数组。例如,你不用象下面这样重复定义有81个字符元素的数组:

char line[81]; char text[81];

定义一个typedef,每当要用到相同类型和大小的数组时,可以这样:

typedef char Line[81];

Line text, secondline;

getline(text);

同样,可以象下面这样隐藏指针语法:

typedef char * pstr;

int mystrcmp(pstr, pstr);

这里将带我们到达第一个typedef 陷阱。标准函数strcmp()有两个const char *类型的参数。因此,它可能会误导人们象下面这样声明:

int mystrcmp(const pstr, const pstr);

这是错误的,事实上,const pstr被编译器解释为char * const(一个指向char 的常量指针),而不是const char *(指向常量char 的指针)。

这个问题很容易解决:

typedef const char * cpstr;

int mystrcmp(cpstr, cpstr);

上面讨论的typedef 行为有点像#define 宏,用其实际类型替代同义字。不同点是typedef在编译时被解释

,因此让编译器来应付超越预处理器能力的文本替换。例如:

typedef int (*PF) (const char *, const char *);

这个声明引入了PF 类型作为函数指针的同义字,该函数有两个const char * 类型的参数以及一个int 类型的返回值。如果要使用下列形式的函数声明,那么上述这个typedef 是不可或缺的:

PF Register(PF pf);

Register()的参数是一个PF类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同。做一次深呼吸。下面我展示一下如果不用typedef,我们是如何实现这个声明的:

int (*Register (int (*pf)(const char *, const char *))) (const char *, const char *);

很少有程序员理解它是什么意思,更不用说这种费解的代码所带来的出错风险了。显然,这里使用typedef

不是一种特权,

而是一种必需。typedef 就像auto,extern,mutable,static,和register 一样,是一个存储类关键字。

这并不是说typedef会真正影响对象的存储特性;它只是说在语句构成上,typedef 声明看起来象static,extern 等类型的变量声明。

下面将带到第二个陷阱:

typedef register int FAST_COUNTER; // 错误编译通不过

问题出在你不能在声明中有多个存储类关键字。因为符号typedef 已经占据了存储类关键字的位置,

在typedef 声明中不能用register(或任何其它存储类关键字)。typedef 有另外一个重要的用途,那就是定义机器无关的类型,

例如,你可以定义一个叫REAL 的浮点类型,在目标机器上它可以获得最高的精度:

typedef long double REAL;

在不支持long double 的机器上,该typedef 看起来会是下面这样:

typedef double REAL;

并且,在连double 都不支持的机器上,该typedef 看起来会是这样:

typedef float REAL;

你不用对源代码做任何修改,便可以在每一种平台上编译这个使用REAL 类型的应用程序。唯一要改的是typedef 本身。

在大多数情况下,甚至这个微小的变动完全都可以通过奇妙的条件编译来自动实现。不是吗?

标准库广泛地使用typedef 来创建这样的平台无关类型:size_t,ptrdiff 和fpos_t 就是其中的例子。此外,象std::string 和std::ofstream 这样的typedef 还隐藏了长长的,难以理解的模板特化语法,例如:basic_string,allocator> 和basic_ofstream>。

用途一:

定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:

char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,

// 和一个字符变量;

以下则可行:

typedef char* PCHAR; // 一般用大写

PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针

虽然:

char *pa, *pb;

也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。用途二:

用在旧的C代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为:struct 结构名对象名,如:

struct tagPOINT1

{

int x;

int y;

};

struct tagPOINT1 p1;

而在C++中,则可以直接写:结构名对象名,即:

tagPOINT1 p1;

估计某人觉得经常多写一个struct太麻烦了,于是就发明了:

typedef struct tagPOINT

{

int x;

int y;

}POINT;

POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候

或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。

用途三:

用typedef来定义与平台无关的类型。

比如定义一个叫REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:

typedef long double REAL;

在不支持long double 的平台二上,改为:

typedef double REAL;

在连double 都不支持的平台三上,改为:

typedef float REAL;

也就是说,当跨平台时,只要改下typedef 本身就行,不用对其他源码做任何修改。

标准库就广泛使用了这个技巧,比如size_t。

另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用宏有时也可以完成以上的用途)。

用途四:

为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。举例:

1. 原声明:int *(*a[5])(int, char*);

变量名为a,直接用一个新别名pFun替换a就可以了:

typedef int *(*pFun)(int, char*);

原声明的最简化版:

pFun a[5];

2. 原声明:void (*b[10]) (void (*)());

变量名为b,先替换右边部分括号里的,pFunParam为别名一:

typedef void (*pFunParam)();

再替换左边的变量b,pFunx为别名二:

typedef void (*pFunx)(pFunParam);

原声明的最简化版:

pFunx b[10];

3. 原声明:doube(*)() (*e)[9];

变量名为e,先替换左边部分,pFuny为别名一:

typedef double(*pFuny)();

再替换右边的变量e,pFunParamy为别名二

typedef pFuny (*pFunParamy)[9];

原声明的最简化版:

pFunParamy e;

理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:

int (*func)(int *p);

首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。

int (*func[5])(int *);

func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。

也可以记住2个模式:

type (*)(....)函数指针

type (*)[]数组指针

---------------------------------

陷阱一:

记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如:

先定义:

typedef char* PSTR;

然后:

int mystrcmp(const PSTR, const PSTR);

const PSTR实际上相当于const char*吗?不是的,它实际上相当于char* const。

原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const。

简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。

陷阱二:

typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:

typedef static int INT2; //不可行

编译将失败,会提示“指定了一个以上的存储类”。

”】。(注意typedef int* p[9]与typedef int(*p)[9]的区别,前者定义一个数组,此数组包含9个int*类型成员,而后者定义一个指向数组的指针,被指向的数组包含9个int类型成员)。

现在是不是觉得要认识它们是易如反掌,工欲善其事,必先利其器!我们对这种表达方式熟悉之后,就可以用“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 {

动名词的用法

动名词的用法及练习 你听过英文语法有动词(verb)、名词(noun);但你听过有动名词(gerund)吗 1. The girl is singing a song. 2. The girl singing now is my sister. 3. Singing is one of her hobbies(爱好). 一、名词性的动名词(Nominal Gerund) Nominal Gerund 可以加上定冠词(Definite article,如the)或不定冠词(Indefinite article,如a, an),其他可加在动名词前的还有如:my, this, some, any, all, no 等等。举例如下: 1. The mellow(愉快地) singing of the birds announces the coming of spring. (singing前加定冠词the及形容词mellow;coming 前加the) 2. We knew the robber was near when we heard a faint rustling(沙沙声) in the bushes. (rustling 前加不定冠词a及形容词faint) 从上面的例子可看出如何将一个动词转成名词;但它和真正的名词还是有区别的,那就是没有单数或复数之分。不过,有一些动名词是可以变成真正名词的喔,如:saying, writing, opening, painting, cutting, heading, feeling, being,saving, surrounding, crossing, misunderstanding 等等。它们都可以有复数的喔,方法就是在它们的后面加个s,如:paintings。 二、动词性的动名词(Verbal Gerund) 看看下面的句子: Carelessly writing essays annoys the teacher. 上面的句子里的writing是动名词,但前面有副词carelessly(粗心地),后面又有受词(Object) essays。因此writing就有动词的特征。 注意:Verbal Gerund 这类动名词的前面可不能加上任何冠词(the, a, an ...)喔。 动名词的功能与用法 一、在句子中用作主语(Subject)或主语的补语(Subject Complement): 作主语 1. Listening to music gives me pleasure. (主语Listening ) 2. Running is good exercise. (主语running) 3. Walking to school is a good idea. (主语walking) 作主语的补语 1. My cat's favorite activity is sleeping. (补语sleeping) 2. Seeing is believing. (主语seeing, 补语believing) 主语置于句尾用It + be + ... +v-ing 句型 1. It is fun speaking English. 2. It is of great importance fighting against pollution(污染). 用It is 后接no use. no good, fun 等的句型 1. It is no use learning theory without practice. 2. It is no fun being lost in rain. 用It is 后接useless, nice, good, interesting, worthwhile 等的句型 1. It is worthwhile taking this into consideration. 用There + be + no + v-ing 的句型 1. There is no joking about such matters. 2. There is no getting along with him. (简直无法与他相处) 二、动名词也可以作宾语(Object) 作动词/动词短语的宾语(置于动词或动词短语的后面) 1. I cannot help laughing. (我禁不住笑了起来)(宾语laughing) 2. You should avoid quarrelling with your sister. (宾语quarrelling) 3. You should practice speaking English more. (宾语speaking) 注意:上面三个句子中的动词:help, avoid, practice 只能用动名词作宾语。这类动词还有:dislike 厌恶admit 接受repent 后悔acknowledge 承认

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;

twist的用法总结大全

twist的用法总结大全 twist的用法你知道多少,今天给大家带来twist的用法,希望能够帮助到大家,下面就和大家分享,来欣赏一下吧。 twist的用法总结大全 twist的意思 vt. 扭成一束,搓,捻,绕,卷,连结,交结 vi. 被搓揉,蜿蜒,曲折,扭曲身体,扭动,旋转,转动 n. 揉搓之物,丝线,烟草卷,旋转 变形:过去式: twisted; 现在分词:twisting; 过去分词:twisted; twist用法 twist可以用作动词 twist的基本意思是指纺纱或捻线的一个程序,两股或多股细丝互相拧成纱或线。引申可指“盘绕”“旋转”“扭伤”。用于比喻可指“曲解(话、词等的)意义”。

twist可用作不及物动词,也可用作及物动词。用作及物动词时,接名词或代词作宾语。可用于被动结构。用作不及物动词时,主动形式可含有被动意义。 twist有时可接以形容词作补足语的复合宾语。 twist用作动词的用法例句 She twisted the long scarf round her head.她把那条长围巾围在头上。 Selecting the suitable twist factor in order to meet the needs of flax knitting yarn, it is the key to increase high_grade and productivity of flax knitting products.选择合理的捻系数以满足针织用纱的要求是提高亚麻针织产品档次和生产效率的关键。 We twisted the bed sheets into a rope and escaped by climbing down it.我们把床单搓成绳子,援绳下坠逃跑了。 twist用法例句 1、The battle of the sexes also took a new twist. 两性之争也出现了新的变数。 2、Twist the string carefully around the second stem with the other hand.

动名词的用法详解

动名词的用法详解 今天给大家带来动名词的用法详解,我们一起来学习吧,下面就和大家分享,来欣赏一下吧。 英语语法:动名词的用法详解 动名词因同时拥有动词和名词两者的特点而拥有及其丰富 的用法,熟练的掌握这些用法不仅可以使口语表达更地道生动,也能在写作中增分添彩。 动名词主要有四种用法,做主语,作宾语,作表语,作定语,每种用法下又分小类别,是一个非常复杂庞大的系统,学习者们往往会理不清脉络,今天就为大家带来动名词的用法讲解。 一.作主语 1.直接位于句首 eg.Swimming is a good sport in summer. 2.用it作形式主语,把动名词(真实主语)置于句尾作后置主语。 eg.It is no use telling him not to worry.

.mportant,essential,necessary等形容词不能用于上述结构。 3.用于“There be”结构中 eg.There is no saying when hell come. 4.动名词的复合结构作主语: 当动名词有自己的逻辑主语时,常可以在前面加上一个名词或代词的所有格,构成动名词的复合结构,动名词疑问句通常使用这种结构做主语 eg.Their coming to help was a great encouragement to us. Does your saying that mean anything to him? 二.作宾语 1.作动词的宾语 某些动词后出现非限定性动词时只能用动名词作宾语,不能用不定式。不定式通常指某种特定的动作,但动名词表示泛指,常见的此类动词有: admit,appreciate,excuse,stand,advise,allow,permit,avoid,consider,e njoy,finish,give up,cannot help,imagine,include,keep,understand,keepon,mind,report,risk,mis s,put off,delay,practise,resist,suggest,depend on,think about,set about,succeed in,worry about,burst out,insist on,feel like,be used

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的问题

allow,permit,advise,forbid 后接动词

doing allow,permit,advise,forbid sb to do 有这样几道题: a. We don’t allow __________ in the office. b. We don’t allow people __________ in the office. c. People are not allowed __________ in the office. A. smoking B. to smoke C. smoked D. smoke 此题答案为a句选 A,b句和c句均选 B。一般说来,动词allow(允许)之后应接动名词作宾语,但是若其后接有名词或代词作宾语,则其宾语后的补足语应用不定式,而不是动名词(注意:c句与b句同义,只是c句为b句的被动形式)。 类似以上用法的动词还有 permit,advise,forbid等: 1. a. We don’t permit _________ on the grass. b. We don’t perm it people _________ on the grass. c. People are not permitted _________ on the grass. A. walk B. to walk C. walking D. walked 2. a. He advised _________ early. b. He advised us _________ early. c. We were advised _________ early. A. leave B. to leave C. leaving D. left 3. a. We forbid __________ a noise. b. We forbid people __________ a noise. c. People are forbidden __________ a noise. A. make B. to make C. making D. made

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;就不能传达给读者这样一个意思。 但是本质上是一样的,这样写就是为了传达编程的信息,方便以后维护,和读程序。

高考重点英语语法之allow与permit的运用

高考重点英语语法之allow与permit的运 用 he rules of the club do not permit smoking. 这个俱乐部规定不准吸烟。 They shouldn’t allow parking here; the street is too narrow. 这儿不该允许停车,马路太窄了。 我们不许在池子里游泳。 正:We don’t allow swimming in the pool. 误:We don’t allow to swim i n the pool. 但是,它们虽然不能直接跟不定式作宾语,但可跟不定式的复合结构作宾语。如: We don’t allow [permit] students to eat in the classrooms. 我们不允许学生在教室吃饭。 两者均可后接双宾语。如: We allow passengers one item of hand luggage each. 我们允许每个乘客带一件手提行李。 As it was such a special occasion, she permitted herself a small glass of champagne. 由于那是一个很特别的场合,所以她。

两者均不能后接that引导的宾语从句。如: 我们不允许人们在大教室抽烟。 误:We don’t all [permit] that people smoke in the lecture room. 正:We don’t allow [permit] people to smoke in the lecture room. allow与allow的几点区别: (1) permit 通常指上级、规则或法令等表示的准许,其语气较重;而allow 通常指消极地不加反对,有时含有听任或默许之意,语气较轻:The nurse allowed him to remain there,though it was not permitted. 护士让他留在那儿,而按规定那是不许可的。 (2) permit可用于带形式主语it的被动结构,但allow不行。如: It is not permitted to smoke in the kitchen. 厨房内不准吸烟。

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;

2014年高考高中英语知识点详解及训练(7):allow、permit的用法

高中英语知识点大全(7):allow/permit的用法 1、allow/permit 1)用法相同 allow / permit sb .to do sth .允许某人做某事 allow / permit doing sth . 允许做某事。此时动词只用ing 形式。 反义词forbid 具有同样用法。 2)意义有异同 许多情况下可换用,只是词意的强弱上有差异。allow语意较弱,含有“听任”,“默许”,“不加阻止”的意思;permit 语意较强,强调“正式认可”,“批准”的意思。如: The nurse allowed him to remain there ,though it was not permitted.护士让他留在那里,虽然这时(规定)不允许的。 2、amaze amaze vt.使……惊奇= astonish, surprise The news amazed us greatly.这条消息使我们感到很惊奇。 拓展:(1)amazed人对……感到吃惊的;amazing(某物)……信人吃惊的。 They were all amazed at the amazing news. 听到这个令人吃惊的消息他们感到惊讶。 (2)amazement n. to one’s amazement令人吃惊的是 To my amazement, they have gone to Xishuangbanna. 让我奇怪的是,他们去西双版纳了。

类似短语:to one’s happiness/excitement/sadness/puzzlement 使某人高兴的/兴奋的/伤心的/迷惑的是 3、announce/ explain/ introduce/ declare announce, explain, introduce, declare后面不接双宾语,若以人作宾语常置于to后。如: The president announced to the workers the sad news. The president announced the sad news to the workers.总裁向工人宣布了那不幸的消息。 He introduced the new comer to everyone here.他把新来的那个人介绍给这里的每个人。 report to sb.向某人汇报 report sth/sb.to sb.向某人汇报/告诉。 [应用]单句改错 ①The teacher explained his students how to use the computer. ②No one declared us we could not smoke here. Key:①explain后加to ②declare后加to

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、缺点 允许一些看上去混乱的语法,可以把几个声明放在一个声明中。如:

allow与permit的用法区别的用法区别

allow与permit的用法区别的用法区别 1. 两者均可表示“允许”,其区别是permit 通常指上级、规则或法令等表示的准许,其语气较重;而allow 通常指消极地不加反对,有时含有听任或默许之意,语气较轻。如:Nothing is permitted; everything is allowed. 一切都没明文规定可以做,但一切做了也无妨。The nurse allowed him to remain there,though it was not permitted. 护士让他留在那儿,而按规定那是不许可的。 2. 从用法上看. 两者后接动词作宾语时,均要用动名词形式,而不能用不定式。如:We don’t allow [permit] swimming in the pool. 我们不许在池子里游泳。但是若其后接有名词或代词,那么其后须接不定式。如:We don’t allow [permit] children to swim in the pool. 我们不许孩子们在池子里游泳。注意这类结构的被动式之后可用不定式(此时的不定式不是宾语,而是主语补语)。如:正:We do not allow [permit] people to smoke here.正:People are not allowed [permitted] to smoke here.误:People are not allowed [permitted] smoking here. Allow/permit doing sth Allow/permit sb to do sth Sb be allowed/permitted to do sth

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);

allow与permit的用法及区别

allow与permit用法辨析 1. 两者均可后接动名词作宾语,但不能用不定式。如: The rules of the club do not permit smoking. 这个俱乐部规定不准吸烟。 They shouldn’t allow parking here; the street is too narrow. 这儿不该允许停车,马路太窄了。我们不许在池子里游泳。 正:We don’t allow swimming in the pool. 误:We don’t allow to swim in the pool. 但是,它们虽然不能直接跟不定式作宾语,但可跟不定式的复合结构作宾语。如: We don’t allow [permit] students to eat in the classrooms. 我们不允许学生在教室吃饭。 2. 两者均可后接双宾语。如: We allow passengers one item of hand luggage each. 我们允许每个乘客带一件手提行李。 As it was such a special occasion, she permitted herself a small glass of champagne. 由于那是一个很特别的场合,所以她。 3. 两者均不能后接that引导的宾语从句。如: 我们不允许人们在大教室抽烟。 误:We don’t allow [permit] that people smoke in the lecture room. 正:We don’t allow [permit] people to smoke in the lecture room. 4. allow与allow的几点区别: (1) permit 通常指上级、规则或法令等表示的准许,其语气较重;而allow 通常指消极地不加反对,有时含有听任或默许之意,语气较轻:The nurse allowed him to remain there,though it was not permitted. 护士让他留在那儿,而按规定那是不许可的。 (2) permit可用于带形式主语it的被动结构,但allow不行。如: It is not permitted to smoke in the kitchen. 厨房内不准吸烟。 (3) allow可与状语小品词连用,但permit不行。如: She wouldn’t allow me in. 她不让我进去。

相关文档