在C ++中使用*(char *)

时间:2015-09-22 01:38:52

标签: c++

我不明白使用此语法的原因是:*(char *)。它做了什么,是否可以与int等其他数据类型一起使用?

void function(int a)
{
    *(char*)(0x12345 + (0x3980 * a)) = 0xFF;
}

3 个答案:

答案 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 ++中完成。