C语言:指针

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)这样可以使用一个数组初
//始化一个函数表,使用的时候直接用号码就可以了 此处的函数名字就是
//回调函数,赋值就是注册 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值