【问题标题】:Data type warning when initializing pointers初始化指针时的数据类型警告
【发布时间】:2010-12-15 22:50:10
【问题描述】:

我目前正试图围绕 C 语言中的指针进行研究,来自前端开发这并不是一件容易的事。我正在关注this tutorial,一切运行顺利,直到我尝试编译以下示例:

#include <stdio.h>

int main(int argc, char *argv[]) {
    int **ramon;
    int *paul;
    int melissa = 5;
    paul = &melissa;
    ramon = &paul;
    printf("ramon = %d\n", ramon); // <- warning: format '%d' expects type 'int'...
    printf("&paul = %d\n", &paul); // <- warning: format '%d' expects type 'int'...
    printf("*ramon = %d\n", *ramon); // <- warning: format '%d' expects type 'int'...
    printf("&melissa = %d\n", &melissa); <- warning: format '%d' expects type 'int'...
    printf("**ramon = %d\n", **ramon);p1); <- warning: format '%d' expects type 'int'...
    return(0);  
}

从第一行 printf 我得到这个错误:“警告:格式 '%d' 需要类型 'int',但参数 2 的类型是 'int **'”

我认为这与我初始化指针的方式有关,但站在陡峭的学习曲线的底部,我不知道如何进步。出了什么问题,如何初始化指针以避免警告?

【问题讨论】:

    标签: c xcode


    【解决方案1】:

    您的指针初始化看起来正确。问题是您正在尝试使用用于int 值的%d 格式说明符打印int** 类型的变量(即“指向int 的指针的指针”)。

    打印int

    如果您想打印melissa 的值(即5),这本质上是ramon 间接指向的值,您需要取消引用指针值正确的次数。

    取消引用指针是通过* 运算符完成的,它本质上意味着“该指针指向的值”。

    • 取消引用一次(即*ramon)将获得ramon 指向的int* 值。
    • 第二次取消引用将获得int 值,取消引用的int* 值指向该值。
    • 您可以像这样将取消引用运算符链接在一起以获得您想要的:

      printf("ramon = %d\n", **ramon);

    打印指针值

    如果要打印指针(即内存位置)值,可以使用%p 格式说明符。这将以十六进制打印内存地址:

    printf("ramon = %p\n", ramon); // Print the "pointer to the pointer to melissa"
    printf("ramon = %p\n", *ramon); // Print the "pointer to melissa"
    

    【讨论】:

    • @timkl - 谢谢,很高兴能帮上忙!
    【解决方案2】:

    ramon 不是 int,它是一个指向 int 的指针。 **ramon 将是一个整数。您正在尝试使用 %d 打印一堆整数,但您主要是在尝试打印使用格式 %p 的指针。

    【讨论】:

      【解决方案3】:

      阅读man printf。不清楚您是要打印ramon 指向的值还是ramon 的实际值,它是一个指向int 的指针的地址。其他警告也一样。

      【讨论】:

        【解决方案4】:

        表达式ramon 的类型是int **%d 说明符需要int*ramon 将是 int * 类型,**ramon 将是所需的 int

        如果要打印指针本身,请使用 %p 说明符。

        【讨论】:

          【解决方案5】:

          ramonpaul 是指针,用于打印指针本身的值(不是它们指向的值)的 printf 格式说明符是 %p。试试

          printf("ramon = %p\n", ramon);
          

          【讨论】:

            【解决方案6】:

            警告与您如何初始化指针无关,它与 printf%d 说明符与您传递给它的类型之间的类型不匹配有关。

            如果要打印指针,请使用%p

            【讨论】:

              【解决方案7】:

              您声明了“指向 int 类型指针的指针”类型的 ramon。即它拥有指向“类型 int 的指针”的地址。另一方面,%dint 的格式说明符,这就是您收到错误的原因。请尝试以下方法:

              printf("&paul = %p\n", ramon);     //print the address that ramon points to
              printf("&melissa = %p\n", *ramon); //print the address that paul points to
              printf("&melissa = %p\n", paul);   //same as above
              printf("melissa = %d\n", **ramon); //print the contents of melissa
              printf("melissa = %d\n", *paul);   //same as above
              printf("melissa = %d\n", melissa); //same as above
              

              输出

              &paul = 0xbf8072f4
              &melissa = 0xbf8072f0
              &melissa = 0xbf8072f0
              melissa = 5
              melissa = 5
              melissa = 5
              

              【讨论】:

                【解决方案8】:

                我认为这与我初始化指针的方式有关

                当错误消息没有说明初始化时,您为什么要这样认为?再读一遍:

                "warning: format '%d' expects type 'int', but argument 2 has type 'int **'"
                

                您的printf() 调用的格式字符串中有%d,作为您要打印的值的占位符。 %d 用作 int 值的占位符。您要打印的值为ramon。该变量的类型为int**int 类型和int** 类型不一样。

                如果要打印指针,则应编写格式字符串以期望指针。我们用%p格式化指针。

                但站在陡峭的学习曲线的底部,我不知道如何进步。

                进步的方法是阅读错误和/或警告消息并尝试理解它们。错误消息是关于类型的。如果您还没有首先了解值具有类型(即它们是什么类型)的概念,那么您不应该尝试使用指针做任何事情。

                【讨论】:

                  猜你喜欢
                  • 2013-12-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-09-01
                  • 2020-11-21
                  相关资源
                  最近更新 更多