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 についてはわかりません。

もう 1 つの質問ですが、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、そうでなければ、ポインターのアドレスを指定していますが、これはあなたが望むものではありません。ポインターが指すアドレスが必要だと確信しています。

2 行目は次のようになります。

printf("intPtr2->valuePtr value: %d\n", *intPtr2->valuePtr);

ポインター自体なのでintPtr2->valuePtr、実際の int を取得するには、ポインターを逆参照する必要があります。Doing(*intPtr2).valuePtrはまさに何をするかintPtr2->valuePtrであり、->その構文の省略形であるため、valuePtrポインターが残ったままになり、逆参照する必要があります。

例: http://ideone.com/Fh8wwr

于 2013-04-07T04:44:37.160 に答える