我来自Java的背景。我正在学习C,其中我经历了从int到char的类型转换的代码片段。
PrintStream
我的问题是,为什么我们使用(char *)p代替(char)p。
我们只将4字节内存(整数)转换为1字节(字符)而不是与之相关的值
答案 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个字节上),那么
当像(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
的字符数组的第一个对象取决于您打算如何处理指针的意图。