C 理解printf语句中的指针逻辑
我正在学习C语言中的指针,但是我对这个例子有点困惑。下面三条C 理解printf语句中的指针逻辑,c,pointers,printf,dereference,C,Pointers,Printf,Dereference,我正在学习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); pt
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;
}
#包括
int main()
{
无效*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);
返回0;
}
(char*)ptr
称为铸造。一种类型的指针(ptr
)被强制转换为指向另一种类型的变量(char*
)
在您的示例中,ptr
是类型为void
的指针,在不同的位置使用它来指向不同类型的变量
ptr=&ch
这使它指向类型为char
的变量
但是,指针ptr
本身的类型仅为void
,因此在后面的printf()
语句中,它必须显式地强制转换为typechar*
,才能工作
printf("%c\n", *(char*)ptr);
^^^^^^^
然后,它被解除引用以访问驻留在该内存中的元素
printf("%c\n", *(char*)ptr);
^
接下来的其他类型也是如此。
*(char*)ptr
:将ptr
的值视为指向char
数据的指针,然后读取ptr
*(int*)ptr
:将ptr
的值视为指向int
数据的指针,然后读取ptr
(char*)ptr+2
:将ptr
的值视为指向char
数据的指针,然后计算指向char
数据的指针,该数据位于ptr
我相信你已经得到了答案,但为了澄清一个隐藏的问题,让我在现有答案的基础上再补充一些信息
printf(“%c\n”,*(char*)ptr)代码>
将无效指针ptr
强制转换为char
指针,然后取消引用以打印char
值
printf(“%c\n”,*(int*)ptr)代码>
将无效指针ptr
强制转换为int
指针,然后取消引用以打印该int
值的char
表示
printf(“%s\n”,(char*)ptr+2)代码>
在这里,这个问题开始发挥作用。由于强制转换运算符优先于二进制加法,因此首先将ptr
强制转换为char*
,然后指针算法将生效,递增指针以指向第三个char
元素(记得吗?)