理解 printf 语句中的指针逻辑

understanding pointer logistics in printf statement

我正在学习 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;
}

(char*)ptr 称为铸造。一种类型的指针 (ptr) 被转换为指向另一种类型 (char*) 的变量。


在你的例子中,ptr是一个void类型的指针,它在不同的地方被用来指向不同类型的变量。

ptr=&ch; 这使得它指向一个 char.

类型的变量

然而,指针 ptr 本身只是 void 类型,所以稍后在 printf() 语句中,必须显式转换为 char* 类型才能使它有效。

printf("%c\n", *(char*)ptr);
                ^^^^^^^

然后,取消引用以访问驻留在该内存中的元素。

printf("%c\n", *(char*)ptr);
               ^

其他类型同理。

  • *(char*)ptr : 把ptr的值当作一个指向char数据的指针,然后读取ptr[指向的char数据=29=]
  • *(int*)ptr : 把ptr的值当作指向int数据的指针,然后读取ptr[指向的int数据=29=]
  • (char*)ptr+2 : 把ptr的值当作一个指向char数据的指针,然后计算一个指向char数据的指针,它是2个元素在 ptr
  • 指向的元素之前

我相信您已经得到了答案,但为了澄清 隐藏的 点,让我在现有答案中添加更多信息。

  • printf("%c\n", *(char*)ptr);

    将 void 指针 ptr 转换为 char 指针,然后取消引用以打印 char 值。

  • printf("%c\n", *(int*)ptr);

    将 void 指针 ptr 转换为 int 指针,然后取消引用以打印 int 值的 char 表示。

  • printf("%s\n", (char*)ptr+2);

    在这里,operator precedence 发挥了作用。由于转换运算符将优先于二进制加法,首先 ptr 将转换为 char *,然后指针运算将生效,将指针递增指向第 3 个 [=12] =] 元素(基于 0 的索引,还记得吗?)。