2013-04-07 3 views
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. я понятия не имею об этом не @@ а

и еще один вопрос, что такое 1834136? это цифры без знака?

спасибо

+1

'% d' не является правильным спецификатор формата для указателя. – chris

+0

нет, я пытаюсь напечатать значение 5 в версии 2, но это не позволяет это сделать. –

+0

В этом случае вам нужно разыменовать его, чтобы получить значение, на которое оно указывает. – chris

ответ

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 уже указатель, как вы сказали, в противном случае вы» re, давая ему адрес указателя, который не то, что вы хотите. Я уверен, что вам нужен адрес, на который указывает указатель.

Вторая линия должна быть:

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

Поскольку intPtr2->valuePtr является сам указатель, но вам все равно придется разыменования его, чтобы получить реальную Int. Выполнение (*intPtr2).valuePtr - это именно то, что intPtr2->valuePtr делает, -> является короткой рукой для этого синтаксиса, поэтому вы все равно останетесь с указателем valuePtr и все равно придется разыгрывать его.

Пример: http://ideone.com/Fh8wwr

+0

hmmm, ok ... У меня есть еще один вопрос в первой строке, & inPtr-> valuePtr - это адрес valuePtr? и intPtr-> valuePtr - это адрес intPtr? –

+0

'& inPtr-> valuePtr' - это адрес' valuePtr' и 'intPtr-> valuePtr' - это указатель на (в вашем случае возвращает адрес)' value2', так как это то, на что вы его указывали. –

+0

ОК, спасибо: D –

Смежные вопросы