C语言(链表和typedef)

链表

  • 链表是基础的数据结构:根据需求有单链表,双链表,循环链表和块状链表等(链表的出现弥补了数组的先天不足)
  • 链表利用结构体创建:头插法要改动头结点时;由于头指针指向头结点,所以调用的方法要修改头指针指向新头结点,就需要用到头指针的地址;相应的接收头指针处要用二级指针(指向指针的指针)

  单链表:数据域,指针域(指向下一个结点)

内存池

  因为动态申请内存时使程序要访问内存,使的效率较低;

  所以释放动态申请的内存时;先将其放入内存池,在下次动态申请内存时就可以直接把内存池中的内存拿出来用;

  构建:利用链表,初始化内存池时为一空链表,加入内存池时只需将这个结构体结点的内存插入这个链表;当再次为这种结构体动态申请内存时就可以直接在内存池中把这个结点重新赋值取出来用(相应内存池要删除这个结点);


typedef 起别名

typedef 原名 别名1,别名2;
typedef int t,*INT

//typedef 起别名;相比宏定义的直接替换,typedef是对类型的封装。
#define int *INT    
INT a,b;//相当于 int *a,b;

typedef int * INT
INT a,b;//相当于 int *a,*b;
//typedef 给结构体起别名会使得结构体更方便,因为每次使用都不能忘记 struct ,如:
typedef struct Data{
int year;
int month;
int day;
}DATE,*PDATE; 
//定义结构体之后起结构体和结构体指针别名;

还有一些其他的使用方式:

int (*)[3]
typedef int (*PTR_TO_ARRAY)[3];//给数组指针起别名 int (*)(void) typedef int (*PTR_TO_ARRAY)(void);
//给一个函数指针起别名(因为并列括号,第一个有 '*' ):指向参数为 void,返回值为 int 的函数 void (*funA( int , void (*funB)( int ) ) )( int ) //由优先级找到:void (*funB)( int );函数指针,参数为 int,返回值为 void 的函数;(void :无类型) //然后:*funA( int , void (*funB)( int ) ):指针函数,参数为 int 整性和函数指针,返回值: void (*funA( 参数 ) )( int ): //在找返回值时,只需把函数定义部分去掉,即 void (*)( int );函数指针,指向的函数参数为 int,返回值为 void;
typedef void ( *PTR_TO_TUN )( void );
PTR_TO_TUN funA( int,PTR_TO_FUN);

注:void *fun( int ):指针函数;返回值为指针的函数;去掉函数体就是函数返回值类型:void *

  void (*fun)( int ):函数指针;指向参数为 int 返回值为 void 的函数;去掉函数就是;去掉指针名就是指向函数的类型:void (*)(int)

  void ( *fun( char ) )( int ):指针函数,【参数为char】【返回值:函数指针,void (*)( int )】

  名前有 '*' ;名后为 ')' 说明为函数指针,名后为 '(' 说明为指针函数【去掉函数名和参数列表剩下的就是函数的返回值类型】

猜你喜欢

转载自www.cnblogs.com/TianLiang-2000/p/12699224.html
今日推荐