我不明白使用此语法的原因是:*(char *)
。它做了什么,是否可以与int
等其他数据类型一起使用?
void function(int a)
{
*(char*)(0x12345 + (0x3980 * a)) = 0xFF;
}
答案 0 :(得分:4)
*(char *)hoge
表示将hoge
解释为char
的指针,并阅读hoge
指向的数据。
它可以与其他数据类型一起使用,例如int
。
一个用法示例:qsort
int cmp(const void *x, const void *y) {
int a = *(int *)x;
int b = *(int *)y;
if (a > b) return 1;
if (a < b) return -1;
return 0;
}
答案 1 :(得分:0)
我不知道你从哪里得到了你的榜样,但由于某些原因它对我没有意义。无论如何,当你在(char *)之前使用字符“*”时,你正在告诉编译器将这些括号中的值(0x12345 +(0x3980 * a))转换为指向char的指针,然后将内存中该位置的值存储更改为0xFF。 换句话说,刚刚发生的事情就是你在内存中抓取了一个随机位置,你告诉编译器就像该位置包含一个字符“*(char *)”,然后在那里存储我的值“0xFF”。
答案 2 :(得分:0)
这个问题已经过去了,但这里是一个“真实世界”的例子,使用了这种语法。
在(低级)嵌入式软件开发中,您经常需要与mcu的硬件外围设备接口。这些外设由寄存器控制,寄存器映射到固定存储器地址。
当一个mcu具有多个相同的外设(即3个ADC)时,它通常会有3个相等的寄存器组相互映射。
在连接时,您希望直接使用地址,但添加抽象。一个简单的控制API可能如下所示:
.H文件
/* Header file, defines addresses for specific chip*/
#define ADC_BASE_ADDRESS 0x00001000 /* Start address of first register of ADC0 */
#define SIZEOF_ADC_REGISTERS 0x00000020 /* Size of all ADC0 registers */
#define ADC_REG_CFG_OFFSET 0x00 /* ADC Config register offset */
#define ADC_REG_BLA_BLA_OFFSET 0x04 /* ADC Config register offset */
/* etc, etc, etc*/
#define ADC_CFG_ENABLE 0x01 /* Enable command */
.C文件
#include "chip.h"
void adc_enable(int adc){
*(uint32_t *)(ADC_BASE_ADDRESS + ADC_REG_CFG_OFFSET + (adc * SIZEOF_ADC_REGISTERS)) = ADC_CFG_ENABLE;
}
/* Calling code */
adc_enable(0);
adc_enable(3);
请注意,如上所述,这通常在C中完成,而不是在C ++中完成。