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)
,如果您想要一个intprintf的地址(“**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
有typeint**
,**r
有typeint*
,而***r
有typeint
正如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 );