C 格式‘;%d’;应为类型为‘;int’;

C 格式‘;%d’;应为类型为‘;int’;,c,C,int**q: q是指向指向int的指针的指针 当你只去引用它一次,它就会给你一个指针 printf(“**q的值为:%d\n”,*q)必须是printf(“**q的值为:%d\n”,**q),如果您想要一个intprintf的地址(“**q的地址是:%p\n”,*q) 对于C声明,您可以阅读;对于练习,您需要使用格式字符串%p打印指针。格式说明符p需要一个空指针,而*q是一个整数指针,因此还需要强制转换。之所以需要强制转换,是因为空指针的大小和表示形式可能与整数指针不同。以下是更正后的打印声明

int**q

q是指向指向int的指针的指针

当你只去引用它一次,它就会给你一个指针

printf(“**q的值为:%d\n”,*q)必须是
printf(“**q的值为:%d\n”,**q)
,如果您想要一个int
printf的地址(“**q的地址是:%p\n”,*q)


对于C声明,您可以阅读;对于练习,您需要使用格式字符串
%p
打印指针。格式说明符
p
需要一个空指针,而
*q
是一个整数指针,因此还需要强制转换。之所以需要强制转换,是因为空指针的大小和表示形式可能与整数指针不同。以下是更正后的打印声明:

int %d / %i
long    %ld
float/double    %lf / %f
char    %c
string (char*)  %s
pointeur (void*)    %p
short   %hd
entier hexadécimal  %x

根据您的声明,各种表达式及其类型之间的关系如下:

printf("The value of *q is: %p\n", (void *) *q);
x
的类型是
int
,因此表达式
&x
的类型是
int*
(指针指向
int
)。
p
的类型是
int*
(指针指向
int
),因此表达式
&p
的类型是
int**
(指针指向
int
)。类似地,
q
的类型是
int**
,因此表达式
&q
的类型是
int***
(指针指向指针指向
int
)。另一方面,
r
的类型是
int***
(指针指向指向
int
),因此表达式
*r
有type
int**
**r
有type
int*
,而
***r
有type
int

正如August指出的,打印指针值(任何指针类型)的正确方法是使用
%p
转换说明符,并将指针参数强制转换为
void*

   r ==  &q              // int *** == int ***
  *r ==   q == &p        // int **  == int **  == int **
 **r ==  *q ==  p == &x  // int *   == int *   == int *  == int *
***r == **q == *p ==  x  // int     == int     == int    == int

等等。这可能是你唯一需要在C中显式投射指向
void*
的指针的地方。

我希望这篇文章的格式几乎符合要求。
*q
仍然是一个指针,因为
q
声明为
int**q
q的值是*q?
int**q具有两级指针间接寻址。它是指向
int
的指针。要访问该内存位置的整数,必须删除两个间接级别,例如
**q
。第一个
“*”
删除一个指向的指针。下一步将删除第二个指针,指向只保留
int
。如果您想打印指针地址,请参阅下面August Karlstrom的答案。我正在学习一个视频教程,其中格式说明符是%d,它给出了预期的o/p。它是用来做IDE的吗?我使用的是代码块,教程使用的是Visual Studio。@MKSundaram在该特定平台上可能是意外工作的,但行为未定义。如果启用编译器警告,您将看到编译器会抱怨。@MKSundaram另一方面,如果您想打印整数
**q
,您(当然)可以使用格式字符串
%d
。我正试图打印地址。%p确实为我工作。我在想我是不是错过了什么。谢谢你的简单解释。这很有帮助。@MKSundaram我想知道我是否遗漏了什么。对您错过了一个事实,即您观看的视频教程使用
%d
打印指针值是错误的。另一个有用的链接:如何读取C声明非常有用。
int %d / %i
long    %ld
float/double    %lf / %f
char    %c
string (char*)  %s
pointeur (void*)    %p
short   %hd
entier hexadécimal  %x
printf("The value of *q is: %p\n", (void *) *q);
   r ==  &q              // int *** == int ***
  *r ==   q == &p        // int **  == int **  == int **
 **r ==  *q ==  p == &x  // int *   == int *   == int *  == int *
***r == **q == *p ==  x  // int     == int     == int    == int
printf( "value of x = %d, address of x = %p\n", x, (void *) &x );
printf( "value of p = %p, address of p = %p\n", (void *) p, (void *) &p );
printf( "value of q = %p, address of q = %p\n", (void *) q, (void *) &q );
printf( "value of r = %p, *r = %p, **r = %p, ***r = %d\n", 
  (void *) r, (void *) *r, (void *) **r, ***r );