类型转换字符指针

Type casting the character pointer

我从 Java 回来 ground.I 正在学习 C,我在其中完成了从 int 到 char 类型转换的代码片段。

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

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

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

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

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

考虑

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 ) 的字符数组的第一个对象取决于您的意图,即您将如何处理指针。

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

考虑一下:

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

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

这里我决定"see"那部分内存作为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 我们不知道这个位置是什么。

我希望这能澄清你的问题