类型转换字符指针
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 我们不知道这个位置是什么。
我希望这能澄清你的问题
我从 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 我们不知道这个位置是什么。
我希望这能澄清你的问题