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

谢谢

4

1 回答 1

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

于 2013-04-07T04:44:37.160 回答