OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3771|回复: 8

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

[复制链接]

29

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2018-8-3
在线时间
48 小时
发表于 2018-10-26 14:38:41 | 显示全部楼层 |阅读模式
5金钱
地址和指针是一个东西吗?
两个例子为什么不同?
一、
//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的关系呢?


最佳答案

查看完整内容[请看2#楼]

其实两种方式都可以, 因为它俩是可以随时转换的 void Fun(u32 Addr){ u8 value; value = *((u8*)Addr); // 你所谓的地址转作指针的操作方式 ........ } void Fun(u8* Ptr){ u32 Address; Address = (u32)Ptr; // 把指针转为你所谓的地址的操作方式 ........ }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-10-26 14:38:42 | 显示全部楼层
本帖最后由 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;    // 把指针转为你所谓的地址的操作方式
       ........
}

回复

使用道具 举报

0

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2018-5-9
在线时间
164 小时
发表于 2018-10-26 14:44:30 | 显示全部楼层
你把指针当成查找表就好了,以p_value作为索引去查找对应地址的值
回复

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-10-26
在线时间
16 小时
发表于 2018-10-26 15:47:57 | 显示全部楼层
本帖最后由 armboy 于 2018-10-26 15:56 编辑

二、((USART_TypeDef *) USART1_BASE) 就是硬件上的映射
三、①也可以用u32 *par,但是实现算法得更改,原来已经是地址了,你还用一个指针指向他,然后把指针传进来。②SendBuff为数组名,数组名代表数组第一个元素的地址。所以就是地址。(u32)SendBuff和(u32  *)SendBuff不一样。后者强转成了一个指向无符号整型的指针了
回复

使用道具 举报

29

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2018-8-3
在线时间
48 小时
 楼主| 发表于 2018-10-26 17:30:58 | 显示全部楼层
我说的好像太多了,简洁一点。
数组名我要做为实参传递给函数,那形参应该是什么格式?
函数声明:
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,只是在函数内部实现的功能代码不同,是这个意思吗?
呼唤大神。
回复

使用道具 举报

29

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2018-8-3
在线时间
48 小时
 楼主| 发表于 2018-10-26 17:37:29 | 显示全部楼层
数组名就是数组首元素的地址,是不是,rs485buf这个数组名 其实 就是  一个  类似于  0x20000000  这样的一个数?
地址不就是 这样一个数吗?         是这个意思吗?
呼叫原子哥
所以这个数传递给指针就是个指针地址,传递给int b就是个普通的数,
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2018-10-26 17:59:19 | 显示全部楼层
你可以尝试把数组名打印看看
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-10-26 18:28:19 | 显示全部楼层
三十岁大叔 发表于 2018-10-26 17:30
我说的好像太多了,简洁一点。
数组名我要做为实参传递给函数,那形参应该是什么格式?
函数声明:

没有仔细看你前面的内容,
仅就这一楼的疑问谈我的理解:
前者你的理解是对的。
后者即RS485_Receive_Data(u32(rs485buf));
传递的是一个32位的数值,这个数值等于u8 rs485buf[5]的首地址。
至于说,在函数体内部如何处理就看函数的具体实现方法了。
它只是得到了一个32位的数值!!!
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-10-26 18:42:33 | 显示全部楼层
三十岁大叔 发表于 2018-10-26 17:37
数组名就是数组首元素的地址,是不是,rs485buf这个数组名 其实 就是  一个  类似于  0x20000000  这样的一 ...

这种理解基本是正确的。
但这个数组名要作为一个数值传送的时候,
最好加类型强制转换,也就是你上面举例的u32(rs485buf)
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 20:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表