学习内容:
- strlen():给我一个地址,我向后数字符的数量,遇到‘\0’,但是’\0’不算。
sizeof():获得内容的字节大小。 - 二维数组,int a[3][4]; ,
a[0]表示第一行数组名,类型为 int[4];
二维数组名代表第一行数组地址。
一. 回调函数
大体定义:函数A传递自己的函数指针给函数B,函数B用该函数指针回调用函数A。
通用的作用
个人理解的回调函数的用处:你给我什么函数,我就用什么函数。(给啥吃啥)这就能达到一种通用,适配的效果。(一个充电器,你换成苹果充电头,你也可以换成安卓充电头,按你的需要,充电器都可以通用,适配。
通用的作用的例子
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
上述(快速排序库函数)的最后一个参数为一个函数指针,它的目的是希望能适配所有数据类型的输入(用了void,无数据类型),于是它要求使用者能给它一个有着具体数据类型的比较函数,让它适配所有数据类型(你给我什么,我用什么,但我可以通用)。
通用作用例子的char最小字节类型的妙用
问题:既然库函数本身希望输入的参数是void无数据类型的,那么它如何利用这些无数据类型的参数?
解答:1)强制类型转换;2)先强制转换为最小的char*型,再根据实际字节宽度计算。
1)强制类型转换:你希望比较的是整型数据,那么就把“const void *elem1”的elem1强制转换为整型指针“ (int*)elem1。
2)” void *base“传过来的是无数据类型的指针变量base,你要使用base,必须先给予它一个具体的数据类型,才能使用加减来控制地址。于是,我们想到只要使用者告诉我们其使用的一个元素用到的字节数告诉我们,我们将base指针变量的数据类型强制转换为char*,在以使用者告诉我们的字节数为一个单元加减即可,实现对未知数据类型指针的控制。(”(char*)base+N*width")
二. int+1犯的小错误
int a[4]={1,2,3,4};
int * p=(int*)((int)a+1);
其中,(int)a,将数组a首元素地址转换为int整型,再加一,随后(int*)强制转换该值为一个整型指针。
错误:我最初以为int+1,在转回int*,是加了一个int;因为int +1,应该加的是一个int数据吧,就是加了4个字节。
解答:int+1仅仅是一个值加了1,例如,0x00 00 00 F0,该地址转换的值加一为:0x00 00 00 F1,那么它之后转换为整型指针,也就是地址的时候,地址应该为:0x 00 00 00F1,就加了一个字节,而不是四个。
总结:本题的p,是指向数组a的首元素(int类型四个字节)的第二个字节的。
数组a:01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
指针p:指向这里的第二个字节,而不是直接指向02(第五个字节)。
学习产出:
- CSDN 无技术博客 1 篇