C - 指针和取消引用


#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("Version1n");
    intPtr2->valuePtr = value2; //dereference
    printf("intPtr2->valuePtr address %pn",&intPtr2->valuePtr);
    printf("intPtr2->valuePtr value: %dn", intPtr2->valuePtr);
    //print 5
    printf("--------------------------------------------n");
    printf("Version2n");
    intPtr2->valuePtr = &value2;
    printf("intPtr2->valuePtr address %pn",&intPtr2->valuePtr);
    printf("intPtr2->valuePtr value: %dn", intPtr2->valuePtr);
    printf("intPtr2->valuePtr value: %dn", (*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是什么?它是一个无符号数字吗?

谢谢

您应该使用版本2。但是:

printf("intPtr2->valuePtr address %pn",&intPtr2->valuePtr);
printf("intPtr2->valuePtr value: %dn", intPtr2->valuePtr);

第一行应该是:

printf("intPtr2->valuePtr address %pn",intPtr2->valuePtr);

因为valuePtr已经是一个指针,因为你说,否则你给它的指针的地址,这不是你想要的。我很确定你想要的是指针指向的地址。

第二行应该是:

printf("intPtr2->valuePtr value: %dn", *intPtr2->valuePtr);

因为intPtr2->valuePtr是指针本身,但您仍然需要对其解引用以获得实际的int。执行(*intPtr2).valuePtr正是intPtr2->valuePtr所做的,->是该语法的简写,因此您仍然保留valuePtr指针,并且仍然需要对其解引用。

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

相关内容

  • 没有找到相关文章

最新更新