初始化指针时的数据类型警告

时间:2010-12-15 22:50:10

标签: c xcode

我目前正试图围绕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 **'”

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

8 个答案:

答案 0 :(得分:4)

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

打印int

如果要打印int(即5)的值,这实际上是melissa间接指向的值,则需要将指针值取消引用正确的次数。< / p>

通过ramon运算符取消引用指针,它实质上意味着“此指针指向的值”。

  • 取消引用一次(即*)将获得*ramon指向的int*值。
  • 第二次取消引用它将获得取消引用的ramon值指向的int值。
  • 您可以将de-reference运算符链接在一起,以获得您想要的结果:

    int*

打印指针值

如果要打印指针(即内存位置)值,可以使用printf("ramon = %d\n", **ramon);格式说明符。这将以十六进制打印内存地址:

%p

答案 1 :(得分:1)

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

答案 2 :(得分:1)

阅读man printf。目前尚不清楚是否要打印ramon指向的值或ramon的实际值,它是指向int的指针的地址。其他警告也是如此。

答案 3 :(得分:1)

表达式ramon的类型是int **,而%d说明符需要int*ramon类型为int ***ramonint

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

警告与初始化指针的方式无关,它与printf的{​​{1}}说明符与传递给它的类型之间的类型不匹配有关。 / p>

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

答案 6 :(得分:1)

您声明了ramon类型“指针指向int类型的指针”。即它拥有“指向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

答案 7 :(得分:0)

  

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

为什么你会认为当错误消息没有说明初始化时?再读一遍:

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

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

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

  

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

进步的方法是阅读错误和/或警告消息并尝试理解它们。错误消息正在讨论类型。如果你没有先了解价值观有一个类型的概念(即它们是什么样的东西),你不应该尝试用指针做任何事情。