了解printf语句中的指针物流

时间:2015-11-17 16:05:23

标签: 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);
    ptr=&j;
    printf("%c\n", *(int*)ptr);
    ptr=cp;
    printf("%s\n", (char*)ptr+2);
    return 0;
}

3 个答案:

答案 0 :(得分:1)

(char*)ptr被称为投射。将一种类型的指针(ptr)强制转换为指向另一种类型的变量(char*)。

在您的示例中,ptrvoid类型的指针,它在各个地方用于指向不同类型的变量。

ptr=&ch;这使得它指向char类型的变量。

但是,指针ptr本身仅为void类型,因此稍后在printf()语句中,必须将其显式转换为char*类型才能使其正常工作

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

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

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

其他类型也是如此。

答案 1 :(得分:1)

  • *(char*)ptr:将ptr的值视为指向char数据的指针,然后读取char ptr数据>
  • *(int*)ptr:将ptr的值视为指向int数据的指针,然后读取int ptr数据>
  • (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基于索引,还记得吗?)。