#include <stdio.h>
#include <stdlib.h>
struct integer2{
int* valuePtr;
struct integer2* next;
};
typedef struct integer2* intpointer2;
int main() {
int value2 = 5;
int* dpointer = &value2;
intpointer2 intPtr2 = (intpointer2)malloc(sizeof(struct integer2));
//intPtr2->valuePtr = (int*)malloc(sizeof(int));
printf("Version1\n");
intPtr2->valuePtr = value2; //dereference
printf("intPtr2->valuePtr address %p\n",&intPtr2->valuePtr);
printf("intPtr2->valuePtr value: %d\n", intPtr2->valuePtr);
//print 5
printf("--------------------------------------------\n");
printf("Version2\n");
intPtr2->valuePtr = &value2;
printf("intPtr2->valuePtr address %p\n",&intPtr2->valuePtr);
printf("intPtr2->valuePtr value: %d\n", intPtr2->valuePtr);
printf("intPtr2->valuePtr value: %d\n", (*intPtr2).valuePtr);
//print 1834136
printf("--------------------------------------------\n");
return 0;
}
嗨,我有一个关于指针和放大器的问题。解除引用
在版本#1中,当我放置intPtr2->valuePtr = value2;
时
我可以打印5的值
但在版本#2中,当我放intPtr2->valuePtr = &value2;
时
我打印一个奇怪的输出,如1834136
不是valuePtr指针吗?我存储value2的地址应该没问题。 在版本#1中,我只存储int,但我可以打印值5。 我不知道这个@@ a
还有一个问题,1834136是什么?这是一个无符号数字?
感谢
答案 0 :(得分:1)
您应该使用版本2.但是:
printf("intPtr2->valuePtr address %p\n",&intPtr2->valuePtr);
printf("intPtr2->valuePtr value: %d\n", intPtr2->valuePtr);
第一行应该是:
printf("intPtr2->valuePtr address %p\n",intPtr2->valuePtr);
由于valuePtr
已经是你所说的指针,否则你给它指针的地址,这不是你想要的。我很确定你想要指针指向的地址。
第二行应该是:
printf("intPtr2->valuePtr value: %d\n", *intPtr2->valuePtr);
由于intPtr2->valuePtr
是指针本身,但您仍需要取消引用它以获取实际的int。执行(*intPtr2).valuePtr
正是intPtr2->valuePtr
所做的,->
是该语法的简写,因此您仍然需要使用valuePtr
指针,仍然需要取消引用它