一. typedef
typedef A B
就是给A起一个外号叫B
C语言中可以直接使用int 定义一个变量,但是涉及到比如结构体,就需要用如下格式去声明和定义:
struct Book
{
};
在调用这个结构体时,需要用如下命令
struct BOOK book1;
就不能像Int一样方便。
当我们用typedef时,相当于给这个结构体起了个外号:
typedef struct Book
{
}EYES;
那么后面在需要调用这个结构体的时候,只需要:
EYES book1;
二.结构体
格式:
struct 结构体名
{
}结构体变量;
struct 结构体名 *ptr = 结构体变量名;
eg.
struct Book
{
}book1;
struct Book *ptr = &book1;
结构体名即类型名,定义一个指针指向该类型,其值为变量的地址。
结构体变量名与数组变量名不同,数组名本身可作为地址,结构体变量名不可,需要取址。
当需要指向结构体中的元素时
用p->name 即可。
三.函数
函数指针
函数名本身可以作为函数的地址,调用函数时,func() 和(*func)()均可。
a=函数(),则将函数返回的值赋予a。
定义完函数后,定义一个指向函数的指针。
int max(int *a,int *b)
{
}
int (*p)(int *a,int *b);
p=max;
参数传递
C语言参数传递分为两种:值传递和引用传递。值传递是将实参的值传递给形参,形参是实参的副本(可理解为另一块内存),在函数中修改形参不影响实参的值。引用传递是将实参的地址传递给形参,形参是实参的别名,在函数内部对形参的修改会影响实参的值。
说白了,就是如果是值传递,函数内部不管怎么修理形参,修理的都是实参之外的另外开辟的一块内存的值(我是这么理解的,实际是不是不确定,不过估计多半是)。如果是引用传递,就是虽然我形参是另外一片地区,但是你把地址给我了,我就能像操控提线木偶一样操控这个地址的值,所以就能通过这种方式改变你实参,哈哈哈哈哈!
函数地址
得到函数地址有两种方式:①func ;②&func
“因此,对于test和&test你应该这样理解,test是函数的首地址,它的类型是void (),&test表示一个指向函数test这个对象的地址,
它的类型是void (*)(),因此test和&test所代表的地址值是一样的,但类型不一样。test是一个函数,&test表达式的值是一个指针!” ----引用自网友
四.句柄
参考文章:https://www.cnblogs.com/zpcdbky/p/4652151.html
简言之,句柄类似指针,但其中所存放的值可以变化。句柄中存放的地址指向一片区域的首地址,在每一次线程更新…之类的可能这个句柄就不指向该区域了,指向别的区域,但句柄本身的位置不变。就是说需要用谁把谁的地址放在句柄里,好调用,效率高。