0 指针基础
0.1 内存和地址
- 内存是由一个一个的bit组成,但是单独使用的话用处不大,所以直接组成一组(字节)作为一个单位。
- 每个地址指向一个字节。为了存储更大的值,所以直接以字来作为存储单元。但是每个地址还是指向一个字节。如果以一个字为单位存储的话,那么每次访问就只能以字为单位。,否则会出现非法访问的问题。
0.2 指针常量
如果要把一个常量赋值给一个内存地址,操作如下:
*(int *)100 = 1;//需要做一次强制转换
0.3 指针的指针
int a =12;
int *b = &a;
int **c = &b;
其中c就是指针的指针,int **是声明,c=&b,其实是把b的地址赋值给了c。
表达式 | 赋值的表达式 |
---|---|
c | &b |
*c | *b , &a |
**c | *&a,a |
0.4 指针表达式
//case 1
int a[10]={0,1,2,3};
int *cp =&a;
printf("*cp+1 = %d",*cp+1);//*cp+1 = 1
printf("*(cp+1) = %d",*(cp+1));//1
*++array1//用数组不可以,由于++优先级高,所以先执行++后执行 *
array1++//先执行++后执行
0.5 字符串长度函数
u32 strlen(* char string)
{
u32 length;
while(*string++ != '\0')
length++;
return length;
}
0.6 指针运算
定义的指针是什么类型,那么指针在加一时就是加的什么类型,而不是u8。
1 指针定义
指针是一个变量,其值为另一个变量的地址,即内存的直接地址。
- type *var-name;
- 其中type为指针的基类型即变量类型(enum不能作为指针类型),即指向的地址数据的类型。
- 使用的*与乘法使用的相同,表明变量是指针。
- 所有的数据类型不管是什么类型,对应的指针的值是一样的,都是代表内存地址的长的十六进制数。唯一不同的是,指针所指向的变量或者常量的数据类型不同。
int num=300;
int *ip=#
char *cp=#
double *dp=#
float *fp=#
printf("int ip=%d\n",*ip);//300
printf("int cp=%d\n",*cp);//44 2c
printf("int cp=%d\n",*(cp+1));//1 0x12c=300
2 函数指针与回调函数
https://www.runoob.com/cprogramming/c-fun-pointer-callback.html
https://www.zhihu.com/question/19801131/answer/27459821
在回调中,我们利用某种方式,把回调函数像参数一样传入中间函数。可以这么理解,在传入一个回调函数之前,中间函数是不完整的。换句话说,程序可以在运行时,通过登记不同的回调函数,来决定、改变中间函数的行为。这就比简单的函数调用要灵活太多了。
typedef int (*func)(int x,int b);//*在名字前面 中间函数
typedef
{
func function;
}fun_array;
//函数指针类型的数组
func func_handle_array[]=
{
函数名1,
函数名2,
...
函数名n
};//1)通过这个数组就可以把相同输入的函数放到一个数组中,查看方便
//并且容易调用,每个函数只需要一个id号,就可以和别人对接。
int main()
{
func_array fun[10];
for(int i=0;i<10;i++)
fun[i].function = 函数名字;//2)这样可以使用一个数组初
//始化一个函数表,使用的时候直接用号码就可以了 此处的函数名字就是
//回调函数,赋值就是注册
}