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

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条回答
edmund1234
1楼-- · 2019-07-21 13:50
本帖最后由 edmund1234 于 2018-10-26 18:49 编辑
三十岁大叔 发表于 2018-10-26 17:30
我说的好像太多了,简洁一点。
数组名我要做为实参传递给函数,那形参应该是什么格式?
函数声明:

其实两种方式都可以, 因为它俩是可以随时转换的
void Fun(u32 Addr){
   u8   value;
    value = *((u8*)Addr);    // 你所谓的地址转作指针的操作方式
       ........
}

void Fun(u8* Ptr){
   u32   Address;
    Address = (u32)Ptr;    // 把指针转为你所谓的地址的操作方式
       ........
}

alexvhozy
2楼-- · 2019-07-21 14:28
你把指针当成查找表就好了,以p_value作为索引去查找对应地址的值
armboy
3楼-- · 2019-07-21 19:05
 精彩回答 2  元偷偷看……
三十岁大叔
4楼-- · 2019-07-21 22:10
我说的好像太多了,简洁一点。
数组名我要做为实参传递给函数,那形参应该是什么格式?
函数声明:
void RS485_Receive_Data(u32 *buf);
函数调用:
u8 rs485buf[5];
RS485_Receive_Data(rs485buf);
这应该是我们最常见的形式吧,数组做参数,形参为指针。
但是又看到另外一个写法:
函数声明:
void RS485_Receive_Data(u32 buf);
函数调用:
u8 rs485buf[5];
RS485_Receive_Data(u32(rs485buf));
同样是数组名传递,形参成了一个普通的变量,不是指针。
是不是可以理解为,传递数组,形参格式既可以是指针也可以是普通u32,只是在函数内部实现的功能代码不同,是这个意思吗?
呼唤大神。
三十岁大叔
5楼-- · 2019-07-21 23:52
数组名就是数组首元素的地址,是不是,rs485buf这个数组名 其实 就是  一个  类似于  0x20000000  这样的一个数?
地址不就是 这样一个数吗?         是这个意思吗?
呼叫原子哥
所以这个数传递给指针就是个指针地址,传递给int b就是个普通的数,
a5820736
6楼-- · 2019-07-22 04:53
你可以尝试把数组名打印看看

一周热门 更多>