【问题标题】:Type casting the character pointer类型转换字符指针
【发布时间】:2017-06-09 13:19:44
【问题描述】:

我来自 Java 背景。我正在学习 C,其中我通过代码 sn-p 进行从 int 到 char 的类型转换。

int a=5;
int *p;
p=&a;
char *a0;
a0=(char* )p;

我的问题是,为什么我们使用 (char *)p 而不是 (char)p。

我们只是将 4 字节内存(整数)转换为 1 字节(字符),而不是与之相关的值

【问题讨论】:

  • p是整数a的指针值
  • 不,您将p指向的a地址的n bytes转换为具有相同宽度的a0字符指针
  • 类型必须匹配。
  • 没有理由将int* 转换为char*。这将导致各种签名错误。也许您打算使用unsigned char* 或uint8_t*?

标签: c pointers typecasting-operator


【解决方案1】:

您需要将指针视为包含地址的变量。它们的唯一目的是向您展示在内存中查看的位置。

所以考虑一下:

int a = 65;
void* addr = &a;

现在'addr'包含'a'所在的内存地址 你用它做什么取决于你。

在这里,我决定将内存的那部分“查看”为 ASCII 字符,您可以打印它以显示字符“A”

char* car_A = (char*)addr;
putchar(*car_A); // print: A (ASCII code for 'A' is 65)

如果你决定按照你的建议去做:

char* a0 = (char)addr;
  • 赋值(char)addr 的左侧部分会将指针“addr”(可能是 4 或 8 个字节)转换为 char(1 个字节)

  • 赋值的右边部分,被截断的地址,将被赋值为指针'a0'的地址

如果你不明白为什么它没有意义,让我用一个具体的例子来澄清

假设'a'的地址是0x002F4A0E(假设指针存储在4个字节上)那么

  • '*addr' 等于 65
  • 'addr' 等于 0x002F4A0E

当像 (char)addr 那样投射它时,它等于 0x0E。 所以这条线

char* a0 = (char)addr;

成为

char* a0 = 0x0E

所以'a0'最终会指向地址0x0000000E,我们不知道这个位置有什么。

我希望这能澄清你的问题

【讨论】:

    【解决方案2】:

    首先,p 不一定是 4 个字节,因为它依赖于架构。其次,p 是指向整数的指针,a0 是指向字符的指针,而不是字符。您正在获取一个指向整数的指针并将其转换为指向字符的指针。这样做的充分理由很少。您也可以将值转换为角色,但我也无法想象这样做的任何理由。

    【讨论】:

      【解决方案3】:

      指针不提供是否指向数组第一个对象的单个对象的信息。

      考虑

      int *p;
      int a[5] = { 1, 2, 3, 4, 5 };
      int x = 1;
      
      p = a;
      p = &x;
      

      所以在指针p中有一个值你不能说这个值是数组a的第一个元素的地址还是单个对象的地址x。

      正确解释地址是您的责任。

      在这个表达式语句中

      a0=(char* )p;
      

      指针p指向并被int类型的对象占用的内存范围的地址(不知道是单个对象还是数组的第一个对象)被解释为char 类型的对象占用的内存范围的地址。它是char 类型的单个对象还是大小等于sizeof( int ) 的字符数组的第一个对象取决于您的意图,即您将如何处理指针。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-09
        • 2021-09-20
        • 2020-06-15
        • 1970-01-01
        • 2015-02-14
        • 2012-06-18
        • 2013-02-12
        相关资源
        最近更新 更多