地址和指针是一个东西吗?
两个例子为什么不同?
一、
//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的关系呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
其实两种方式都可以, 因为它俩是可以随时转换的
void Fun(u32 Addr){
u8 value;
value = *((u8*)Addr); // 你所谓的地址转作指针的操作方式
........
}
void Fun(u8* Ptr){
u32 Address;
Address = (u32)Ptr; // 把指针转为你所谓的地址的操作方式
........
}
数组名我要做为实参传递给函数,那形参应该是什么格式?
函数声明:
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,只是在函数内部实现的功能代码不同,是这个意思吗?
呼唤大神。
地址不就是 这样一个数吗? 是这个意思吗?
呼叫原子哥
所以这个数传递给指针就是个指针地址,传递给int b就是个普通的数,
一周热门 更多>