这里只是列举了lua当中用到的c 语言的知识
1. lua_KFunction
这个类似c#中的委托 类型是lua_KFunction ,参数是后面三个
比如 定义一个 lua_KFunction func1,就等于 声明了一个函数 int *func1 (lua_State,int,lua_KContext)
2. char**agrv
相当于string[]数组
3.void*ud
它不是空类型,而是可以转换成任意类型的指针,比如可以转换为int,float 等
4.void**ud
任意类型指针的数组
5.ptrdiff_t
《C和指针》P110 分析如下:两个指针相减的结果的类型为ptrdiff_t,它是一种有符号整数类型。减法运算的值为两个指针在内存中的距离(以数组元素的长度为单位,而非字节),因为减法运算的结果将除以数组元素类型的长度。所以该结果与数组中存储的元素的类型无关。
ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型。ptrdiff_t类型变量通常用来保存两个指针减法操作的结果。
6.intptr_t
在64位的机器上,intptr_t和uintptr_t分别是long int、unsigned long int的别名;在32位的机器上,intptr_t和uintptr_t分别是int、unsigned int的别名。
那么为什么要用typedef定义新的别名呢?我想主要是为了提高程序的可移植性(在32位和64位的机器上)。很明显,上述代码会根据宿主机器的位数为intptr_t和uintptr_t适配相应的数据类型。
另外,如注释所言,定义这两个数据类型别名也是为了“void *”指针。
在C语言中,任何类型的指针都可以转换为void *类型,并且在将它转换回原来的类型时不会丢失信息。
7. lua_KContext
综合前面两个 ,我们可以知道lua_KContext的意思,lua_KContext:当可以获取到intptr_t的时候,就是无符号整形,如果获取不到就是 有符号整形(ptrdiff_t)
8.&L 和*L
前面那个是引用,&表示取址,引用L的地址
后面那个是指针,表示取值,把L地址对应的值取出来
9. L->elem 和L.elem的用法
L->elem 中L必须是指针,而L.elem中的L一定是普通结构体变量
->和.都是引用结构体成员的运算符,前者是通过指针引用,而后者是通过变量引用
10.union 共用体
上面说完全覆盖并不准确,应该是占用内存大的成员会覆盖掉占用内存小的成员
union data{
int n;
char ch;
short m;
};
很明显data所占用的内存,为成员中占用最大内存的成员内存,就是n,上图也表示了它们在内存中的表示方法,更改n会覆盖掉ch、m的值,更改ch、m的值只会影响n的一部分
11.memcpy
12.strcmp
13.数组的表现形式
14.(Node *)malloc(sizeof(Node))
15. void *realloc(void *ptr, size_t size);
16.#define
源码分析 参考:
https://blog.youkuaiyun.com/initphp/category_9293184.html?spm=1001.2014.3001.5482