指针中包含的值' 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;
}
答案 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。