C 如何从结构打印指针的值
下面结构中指针“p”中包含的值打印错误,我无法找到正确打印的方法。它的正确代码是什么? 守则:C 如何从结构打印指针的值,c,C,下面结构中指针“p”中包含的值打印错误,我无法找到正确打印的方法。它的正确代码是什么? 守则: #include <stdio.h> struct my_struct{ //structure definition int a,*p; }; int main(){ my_struct var; var.a = 5; //variable definition var.p = &(var.a);
#include <stdio.h>
struct my_struct{ //structure definition
int a,*p;
};
int main(){
my_struct var;
var.a = 5; //variable definition
var.p = &(var.a); //pointer gets address from variable
printf("%d\n",var.p); // the number 2686744 is printed instead of the number '5'
return 0;
}
#包括
struct my_struct{//结构定义
int a,*p;
};
int main(){
我的结构变量;
var.a=5;//变量定义
var.p=&(var.a);//指针从变量获取地址
printf(“%d\n”,var.p);//打印的是数字2686744,而不是数字“5”
返回0;
}
到printf
的%d
格式说明符需要一个int
,但您正在传递一个int*
您需要取消对指针的引用以获得int
:
printf("%d\n",*(var.p));
您没有取消对指针的引用
my_struct var;
var.a = 5;
var.p = &(var.a);
printf("%d\n",*(var.p)); //this will work
当您写入
printf(“%d\n”,var.p)
时,您正在打印指针的文本地址(即不是指针指向的值,而是指针指向的内存中的地址)。要访问指向的值,您需要使用printf(“%d\n”,*(var.p))
取消对指针的引用
附带说明:如果您确实希望在
printf
系列函数中出于任何原因访问指针的地址,请改用%p
格式说明符:在打印时使用*var.p取消指针p的引用并获取其值。现在,您正在以十进制打印内存位置。您的指针var.p只是包含一个地址。当我说包含时,我的意思是它的值是一个地址。
在您的情况下,这是变量a的地址。
当您试图打印其值时,您将打印变量a的地址
如果要打印此地址中包含的内容,或此地址中的值,则必须在其前面加星号
在您的情况下,您不希望将var.p的值作为地址打印,但希望使用*(var.p)打印此地址中包含的值
注意,“var.p”和“(var.p)”在某些语言中可能存在差异。
想象一下这些数学运算:(2x3)²和2x3²。
在第一次运算中,²将影响整个乘法运算,而在第二次运算中,²只影响数字3
事实上,您可能想自己尝试一下,以了解您正在使用的语言是如何工作的,*var.p可能会给您带来不同的结果:)
但是,在这种情况下使用括号是一种很好的做法,即使该语言确实给出了相同的结果
PS:这只是一个额外的信息,如果您需要使用printf打印地址(目前不是您的情况,您只想打印一个小数),请将%d替换为%p。用
*var.p
取消引用它……指针本身就是一个地址。您需要它所指向的值,因此需要使用*
运算符对其进行解引用,即*var.p
您还可以删除&(var.a)
中的括号,而只需使用&var.a
,这更为标准。此外,请注意
的优先级高于一元解引用*
(不是乘法!)因此,其他人对*(var.p)
的建议中的括号是严格可选的,对于那些认为它提供了更清晰的信息(或者不必费心记住优先规则的读者;-)。正如Tom的评论所指出的,
与&
的对比也是如此。快速注释。由于您的结构不是类型定义
'd,您需要使用结构my_struct var;
声明它。只是一个旁注。var
不是指针,因此您不能使用->
(不是我的否决票)关于运算符优先级的额外信息只是误导,因为它不适用于此处。*(var.p)
与*var.p
相同,因为
的优先级高于*
。