C 如何从结构打印指针的值

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);

下面结构中指针“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);           //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
相同,因为
的优先级高于
*