键入强制转换字符指针

时间:2017-06-09 13:19:45

标签: c pointers typecasting-operator

我来自Java的背景。我正在学习C,其中我经历了从int到char的类型转换的代码片段。

PrintStream

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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'

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

假设&#39; <&#39; 的地址为 0x002F4A0E (假设指针存储在4个字节上),那么

  • &#39; * addr&#39; 等于 65
  • &#39; addr&#39; 等于 0x002F4A0E

当像(char)addr一样投射时,这等于 0x0E 。 这一行

char* a0 = (char)addr;

成为

char* a0 = 0x0E

所以&#39; a0&#39;最终将指向地址 0x0000000E ,我们不知道这个位置是什么。

我希望这能澄清你的问题

答案 2 :(得分:0)

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

考虑

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

p = a;
p = &x;

因此在指针p中有一个值,你不能说该值是否是数组a的第一个元素的地址,或者它是单个对象{{1}的地址}。

您有责任正确解释地址。

在这个表达式声明中

x

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