纠结了 关于指针和地址的一个问题

2019-07-21 08:39发布

地址和指针是一个东西吗?
两个例子为什么不同?
一、
//buf:接收缓存首地址
//len:读到的数据长度
函数声明:
void RS485_Receive_Data(u8 *buf)

函数调用:
u8 rs485buf[5];
RS485_Receive_Data(rs485buf);

数组名是指向第一个元素的地址,地址!  buf是指针变量,是一个变量!值为一个内存地址。这个我一直以为理解了,可是今天有点绕晕了。主要是因为第三个问题。

二:
#define USART1              ((USART_TypeDef *) USART1_BASE)
#define USART1_BASE           (APB2PERIPH_BASE + 0x3800)
USART1_BASE是一个地址值,说到底是个数,((USART_TypeDef *) USART1_BASE)    这个操作是什么意思呢,抛开结构体不说,这是不是就相当于一个(int *) 3 操作?这怎么理解?

其实我学STM32有一段时间,本来自我感觉挺清晰的,知道USART1就是一个结构体指针,但是看了下面这个代码我就想了想,晕了,然后就不知道它为什么是结构体指针了。
我的猜测:USART1->DR是一个指针


三、
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输量
函数声明:
void MYDMA_Config(u32 cpar,u32 cmar)       //地址为什么不用指针了?为什么不是u32 * cpar?因为在调用的时候给的参数就是(u32)&USART1->DR,这个是个数还是个指针呢?

函数调用:
u8 SendBuff[SEND_BUF_SIZE];        //发送数据缓冲区

MYDMA_Config(  (u32)&USART1->DR,(u32)SendBuff);     //(u32)SendBuff是什么呢?和(u32  *)SendBuff区别呢?

&USART1->DR这是个指针吗?是 &(USART1->DR) 吗?  看样子好像不是,用u32强制转换,那&USART1->DR 应该是个数吧,是个地址值,地址值和指针的关系是什么,是不是常数1和变量b的关系呢?


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
warship
2019-07-22 07:47
三十岁大叔 发表于 2018-10-26 17:30
我说的好像太多了,简洁一点。
数组名我要做为实参传递给函数,那形参应该是什么格式?
函数声明:

没有仔细看你前面的内容,
仅就这一楼的疑问谈我的理解:
前者你的理解是对的。
后者即RS485_Receive_Data(u32(rs485buf));
传递的是一个32位的数值,这个数值等于u8 rs485buf[5]的首地址。
至于说,在函数体内部如何处理就看函数的具体实现方法了。
它只是得到了一个32位的数值!!!

一周热门 更多>