typedef

此文章所描述的内容适用于C语言,C++也可参考

typedef用法、语法

typedef用于声明类型的别名(typedef名),typedef名与其他普通标识符在本质上无异,遵循相同的作用域规则(例外:所有的typedef名均是无链接的)。

简单示例

typedef int Integer;	//所声明的typedef名是 Integer ,是 int 的别名

复杂示例

typedef int * Integer;				//所声明的typedef名是 Integer ,是 int * 的别名
typedef int F (void) , A[20] , C;	//D1,等价于 D2+D3+D4
typedef int F (void);				//D2,所声明的typedef名是 F ,是无接收参数且返回值类型是 int 的函数类型的别名
typedef int A [20];					//D3,所声明的typedef名是 A ,是包含20个 int 类型元素的数组类型的别名
typedef int C;						//D4,所声明的typedef名是 C ,是 int 的别名
typedef int * (*B) (int *);		    /*所声明的typedef名是 B ,是指向接收一个 int * 类型参数且返回值类型是 int * 的函数的指针       
         							  类型的别名
         							*/
typedef int H [n];					/*所声明的typedef名是 H ,是包含 n 个 int 类型元素的数组类型的别名,详见 <typedef声明与
									 变长数组>
									*/

typedef声明分析方法

typedef声明的组成是:在一般声明语句前加上 typedef ,即成为typedef声明
          (如果一般声明语句是函数原型声明,还需要先将形参列表中的标识符去掉)
与一般声明语句的区别:一般声明语句声明的是对象,typedef声明语句声明的是类型的别名

与一般声明语句的联系:例如,
           T1声明语句(函数原型声明)声明的是特定函数类型的对象(名字是A),那么把T1声明语句转变为T2
           声明语句(typedef声明)后T2声明语句声明的是T1声明语句所声明的对象的类型的别名(名字是A)
           T3声明语句声明的是 int 类型的对象(名字是A),那么把T3声明语句转变为T4声明语句(typedef声
           明)后T4声明语句声明的是T3声明语句所声明的对象的类型(即 int )的别名(名字是A)

int A (int a);			//T1,函数原型声明,A 是一个函数,返回值类型是 int ,接收一个 int 类型的参数,形参名字是 a
typedef int A (int);	//T2,typedef声明,A 是接收一个 int 类型的参数且返回值是 int 的函数类型的别名
int A;					//T3,A 是一个 int 类型的对象
typedef int A;			//T4,A 是 int 类型的别名

一般声明语句的分析方法: 详见 一般声明语句的分析方法

typdef声明别名后如何使用

例如,A 是用typedef声明的 B 类型的别名,那么,下面这行代码声明了一个 B 类型的名字是 b 的对象:

A b;

特别地,如果 A 是特定函数类型的别名,那么写完上述代码后相当于完成了函数原型声明,但仍然需要在后面补充函数 b 的定
义,例如(假设 A 是 int (void) 函数类型的别名):

int b (void)
{
	/* code */
}

typedef名的作用域与类型以及不重名规则

typedef名在本质上与其他普通标识符无异,声明时遵循的作用域规则相同(例外:所有的typedef名均是无链接的)。
typedef名的类型是typedef名本身所代表的类型。
因此,在同一作用域下,typedef名不得与其他已被声明的不同类型的typedef名、其他已被声明的普通标识符重名。

typedef声明与变长数组

下述代码属于变长数组类的typedef声明

int n = 20;
typedef int A [n] , B [n+1];	//A 和 B 均是变长数组类型的别名,当前语境下,A 表示 int [20] 类型,B 表示 int [21] 类型
n = 30;							//typedef声明之后改变 n 的值不影响 A 、B 所表示的变长数组类型的元素个数 

变长数组类的typedef声明所声明的标识符不得具有除了块作用域之外的其他作用域,这意味着变长数组类的typedef声明只能
出现在块内

语法依据:可变修改类型的标识符都只能具有块作用域

注意事项

  1. 存储类指定符 typedef 只用于声明一个现有类型的别名,当它用于声明聚合或联合类型的别名时,并不作用于这些类型的成员。
  2. 存储类指定符 typedef 不得与其他存储类指定符组合使用。
  3. 用存储类指定符 typedef 声明的标识符是无链接的。
  4. 使用 typedef 声明并不能引入和创建新的类型,它仅仅用于定义与指定类型同义的别名。typedef 本身不具备引入和创建新的类型的能力,但这不意味着一条 typedef 声明不能引入和创建新的类型,例如,下述代码创建了新的聚合类型 struct x:
typedef struct x {int test;} x , y , z;
  1. 内置基本类型名和自定义类型名不属于普通标识符。
  2. typedef 名可以重复声明,但如果这些重复声明的 typedef 名具有相同的作用域,那么它们的类型必须相同,而且不是可变修改类型。

小试牛刀

试分析下述代码的含义:

typedef struct x {int test;} x , y , z;
struct x S1;
x S2;
y S3;
z S4;

最后


#define 欢迎小伙伴们留言~

#include 转载请注明出处哦

https://blog.csdn.net/weixin_43737206/article/details/99702648

fprintf(如果你觉得有用的话, "点个好看再走吧 %s" , "嘿嘿");

发布了21 篇原创文章 · 获赞 25 · 访问量 1万+
展开阅读全文

怎么合并链表????

01-03

两个非降序链表的并集,例如将链表1->2->3 和 2->3->5 并为 1->2->3->5,只能输出结果,不能修改两个链表的数据。 #include <stdio.h> #include <stdlib.h> typedef int DataType; typedef struct node { DataType data; struct node *next; }*LinkList, *pNode; LinkList GetEmptyList() { LinkList head = (pNode)malloc(sizeof(struct node)); head->data = 0; head->next = 0; return head; } int AddNode(LinkList head, DataType data) { pNode newnode,p = head; while(p->next) { if(p->next->data == data) return 0; if(p->next->data > data) { newnode = (pNode)malloc(sizeof(struct node)); newnode->data = data; newnode->next = p->next; p->next = newnode; return 1; } p = p->next; } p->next = (pNode)malloc(sizeof(struct node)); p->next->data = data; p->next->next = 0; return 1; } LinkList MergeList(LinkList LA, LinkList LB) { // 合并LA、LB到新表 LinkList head; pNode p,q,t; int flag; head = p = GetEmptyList(); for(q = LA->next; q; q = q->next) { p->next = (pNode)malloc(sizeof(struct node)); p->next->data = q->data; p = p->next; } p->next = 0; for(p = LB->next; p; p = p->next) { // 合并 flag = 1; for(q = head; q->next && flag; q = q->next) { if(p->data == q->next->data) flag = 0; else if(p->data < q->next->data) { t = (pNode)malloc(sizeof(struct node)); t->data = p->data; t->next = q->next; q->next = t; flag = 0; } } if(flag) { q->next = (pNode)malloc(sizeof(struct node)); q->next->data = p->data; q->next->next = 0; } } return head; } void Show(LinkList head) { pNode p = head->next; while(p) { printf("%d ",p->data); p = p->next; } printf("\n"); } int main() { DataType x; LinkList LA = GetEmptyList(); LinkList LB = GetEmptyList(); LinkList LC; printf(""); while(scanf("%d",&x) == 1) { AddNode(LA,x); AddNode(LB,x); printf(""); } LC = MergeList(LA,LB); Show(LC); return 0; } 怎么好像不可以,怎么优化一下? 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览