Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 理解printf语句中的指针逻辑_C_Pointers_Printf_Dereference - Fatal编程技术网

C 理解printf语句中的指针逻辑

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

我正在学习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;
}
#包括
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()
语句中,它必须显式地强制转换为type
char*
,才能工作

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
    元素(记得吗?)