作文:从指针变量到指针函数,路过函数指针

标题:从指针变量到指针函数,路过函数指针
从最简单的指针变量出发,
比如int a;
那么a是一个整形变量
现在int *a;
那么a是一个指针变量
指针a表达的是某个地址,它需要依托某个实实在在的东西
比如:
typedef struct
{
    u16 Head;           
    u16 Tail;
    u16 Lenght;
    u8  Ring_Buff[1024];
}RingBuff_t;

static RingBuff_t ringBuff;
RingBuff_t *pringBuff  = &ringBuff;
这样就定义了一个实实在在的东西ringBuff 和 一个指针变量pringBuff
两者在使用一个是 . 一个是 ->
编程高手一般喜欢指针变量,写出的程序很轻盈,耦合度低。

结论:指针变量其实是一个变量,它指向某个实实在在的东西。


经典嵌入式风格代码:
void buzzinit()
{
*(volatile int *)0X56000010 |=  (1<<0);
*(volatile int *)0X56000010 &= ~(1<<1);
}
库函数风格代码:
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_RESET);//不亮
HAL_Delay(100);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_SET);//亮
HAL_Delay(100);

指针变量风格代码:
unsigned int *P1,*P2;
printf("GPIOB->BRR::%0x Give P1\n",data);
P1=(unsigned int*)data;
data = (unsigned int)&GPIOB->BSRR;
printf("GPIOB->BSRR::%0x Give P2\n",data);
P2=(unsigned int*)data;
void NEWIO_Test(void)
{
	*P1=LED_Pin;//亮//GPIO_PIN_11//0x0800 如果是位带的话这里不需要这样写 就是 0 1 即可
	HAL_Delay(500);
	*P2=LED_Pin;//不亮
	HAL_Delay(100);
}
位带风格:STM32L471失败



继续:函数指针
函数指针重音是指针,它是指向函数的指针。前面说指针变量是指向实实在在的东西,在函数指针的情形下这个实实在在的东西就是一个函数。



补充知识:指针函数
指针函数重音是函数,这个函数比较特殊是它的返回值是一个指针,也就是char*。
【实际编程用的比较少 因为返回char* 内存是个问题 著名函数是malloc】


类型名 *函数名(函数参数列表);

其中,后缀运算符括号"()"表示这是一个函数,其前缀运算符星号"*"表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个"指向返回值为…的指针(地址),"类型名"表示函数返回的指针指向的类型"。

"(函数参数列表)"中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略。其示例如下:

int *pfun(int, int);

由于"*"的优先级低于"()"的优先级,因而pfun首先和后面的"()"结合,也就意味着,pfun是一个函数。即:

int *(pfun(int, int));

接着再和前面的"*"结合,说明这个函数的返回值是一个指针。由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。

2在嵌入式的应用,点亮发光二极管
用库函数
用函数指针
用位带

3在业务层的应用
发卡走流程的抽象

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/86982192