2013-04-07 89 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. 我不知道这个@@ a

和一个问题,什么是1834136?它是一个无符号数字?

感谢

+1

'%d'不是指针的正确格式说明符。 – chris 2013-04-07 04:21:11

+0

不,我试图在版本2中打印5的值,但不允许这样做。 – 2013-04-07 04:25:45

+0

在这种情况下,您需要取消引用它以获取它所指向的值。 – chris 2013-04-07 04:27:28

回答

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

+0

嗯,好的...我在第一行有另一个问题,&inPtr-> valuePtr是valuePtr的地址?和intPtr-> valuePtr是intPtr的地址? – 2013-04-07 06:20:53

+0

'&inPtr-> valuePtr'是'valuePtr'的地址,'intPtr-> valuePtr'是指向(在您的情况下返回地址)'value2'的指针,因为这就是您设置它指向的内容。 – 2013-04-07 06:35:44

+0

好的,谢谢:D – 2013-04-07 07:27:12