指针&提领

时间:2013-04-07 04:19:10

标签: c visual-studio-2010 pointers dereference

#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是什么?这是一个无符号数字?

感谢

1 个答案:

答案 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指针,仍然需要取消引用它

示例:http://ideone.com/Fh8wwr