如何从结构

时间:2016-06-21 14:24:31

标签: 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);           //pointer gets address from variable
    printf("%d\n",var.p);       // the number 2686744 is printed instead of the number '5'

    return 0;
}

5 个答案:

答案 0 :(得分:4)

%d的{​​{1}}格式说明符需要printf,但您传递int

您需要取消引用指针以获取int *

int

答案 1 :(得分:2)

当您编写printf("%d\n", *(var.p))时,您正在打印指针的文字地址(即不是它指向的值,而是内存中指向的位置)。要访问指向的值,需要使用printf取消引用指针。

作为旁注:如果您确实想要在%p系列函数中出于某种原因访问指针的地址,请改用..start: section .text use32 mov dx, msg mov ah, 9 int 21h mov ah, 4Ch int 21h section .data msg db "Hello world!", 0Dh, 0Ah, "$" 格式说明符:http://www.cplusplus.com/reference/cstdio/printf/ < / p>

答案 2 :(得分:0)

你没有取消引用指针

<script src="build/toastr.min.js"></script>

答案 3 :(得分:0)

在print中使用* var.p取消引用指针p并获取它的值。现在您以十进制打印内存位置。

答案 4 :(得分:0)

您的指针var.p只是包含地址。当我说含有时,我的意思是它的价值是一个地址。 在您的情况下,这是var.a的地址。 当您尝试打印时,您将打印var.a的地址。

如果您要在此地址打印包含的内容,或者此地址的 VALUE 是什么,则必须在其前面放置一个星号。

在您的情况下,您不希望打印var.p的作为此地址,但您希望在此地址打印, *(var.p)。

请注意,“ var.p”和“(var.p)”之间的某些语言可能存在差异。 想象一下这些数学运算:(2x3)²和2x3²。 在第一次操作时,²将影响整个乘法,在第二次操作中,²只会影响数字3。

事实上,您可能希望自己尝试了解您使用的语言是如何工作的,* var.p可能会给您一种不同的结果:) 但是,在这种情况下使用括号是一种很好的做法,即使语言确实给出相同的结果。

PS:只是一个额外的信息,如果你需要使用printf打印一个地址(目前不是你的情况,你只想打印小数),用%p替换%d。