我正在学习C中的指针,但我对这个例子略感困惑。下面三个printf()
语句中指针的指针逻辑是什么?这些是什么:*(char*)ptr
,*(int*)ptr
,(char*)ptr+2
,究竟在做什么?
#include<stdio.h>
int main()
{
void *ptr;
char ch=74, *cp="CS107";
int j=65;
ptr=&ch;
printf("%c\n", *(char*)ptr);
ptr=&j;
printf("%c\n", *(int*)ptr);
ptr=cp;
printf("%s\n", (char*)ptr+2);
return 0;
}
答案 0 :(得分:1)
(char*)ptr
被称为投射。将一种类型的指针(ptr
)强制转换为指向另一种类型的变量(char*
)。
在您的示例中,ptr
是void
类型的指针,它在各个地方用于指向不同类型的变量。
ptr=&ch;
这使得它指向char
类型的变量。
但是,指针ptr
本身仅为void
类型,因此稍后在printf()
语句中,必须将其显式转换为char*
类型才能使其正常工作
printf("%c\n", *(char*)ptr);
^^^^^^^
然后,取消引用它以访问驻留在该内存中的元素。
printf("%c\n", *(char*)ptr);
^
其他类型也是如此。
答案 1 :(得分:1)
*(char*)ptr
:将ptr
的值视为指向char
数据的指针,然后读取char
*(int*)ptr
:将ptr
的值视为指向int
数据的指针,然后读取int
(char*)ptr+2
:将ptr
的值视为指向char
数据的指针,然后计算指向char
数据的指针,该数据是前面的2个元素ptr
答案 2 :(得分:1)
我相信您已经得到了答案,但为了澄清隐藏的点,让我为现有答案添加更多信息。
printf("%c\n", *(char*)ptr);
将空指针ptr
强制转换为char
指针,然后取消引用以打印char
值。
printf("%c\n", *(int*)ptr);
将空指针ptr
强制转换为int
指针,然后取消引用以打印该char
值的int
表示。
printf("%s\n", (char*)ptr+2);
在这里,operator precedence开始发挥作用。由于强制转换运算符优先于二进制加法,首先ptr
将被转换为char *
,然后,指针算法将生效,将指针递增指向第3 {{1}元素(0基于索引,还记得吗?)。