我目前正试图围绕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 **'”
我认为这与我初始化指针的方式有关,但站在陡峭的学习曲线的底部,我不知道如何进步。有什么问题,如何初始化指针以避免警告?
答案 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 *
,**ramon
为int
。
如果要打印指针本身,请使用%p
说明符。
答案 4 :(得分:1)
ramon
和paul
是指针,用于打印指针本身的printf
格式说明符(不是它们所指向的)是%p
。尝试
printf("ramon = %p\n", ramon);
答案 5 :(得分:1)
警告与初始化指针的方式无关,它与printf
的{{1}}说明符与传递给它的类型之间的类型不匹配有关。 / p>
如果要打印指针,请使用%d
。
答案 6 :(得分:1)
您声明了ramon
类型“指针指向int类型的指针”。即它拥有“指向int类型的指针”的地址。另一方面,%d
是int
的格式说明符,这就是您收到错误的原因。而是尝试以下方法:
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
格式化指针。
但站在陡峭的学习曲线的底部,我不知道如何进步。
进步的方法是阅读错误和/或警告消息并尝试理解它们。错误消息正在讨论类型。如果你没有先了解价值观有一个类型的概念(即它们是什么样的东西),你不应该尝试用指针做任何事情。