首先,我有点宿醉,所以我不确定如何制定这个问题。随意编辑标题或内容以提供更好的洞察力。
我有两种方法。它们都打印指针的地址。但是地址不同。在main函数中打印指针地址时,结果与将指针地址传递给函数和打印完全相同。但是当将指针传递给函数并打印地址时,会得到一个不同的地址。这是为什么?
我已经明白,在将变量传递给函数时,它会复制值并分配新的内存。但为什么不为指针的地址执行此操作?
void print_pointer_1(int** p) {
printf("In print_pointer_1 address is : \t\t\t%p\n", p);
}
void print_pointer_2(int* i) {
printf("In print_pointer_2 address is : \t\t\t%p\n", &i);
}
int main() {
int j = 1;
int* i = &j;
printf("Directly printing the pointers address in main : \t%p\n", &i);
print_pointer_1(&i);
print_pointer_2(i);
return 0;
}
产生这些输出:
Directly printing the pointers address in main : 0x7fff24330a48
In print_pointer_1 address is : 0x7fff24330a48
In print_pointer_2 address is : 0x7fff24330a28
答案 0 :(得分:3)
void print_pointer_2(int* i) {
^
Here is the local variable, you're
printing the address of this local variable.
printf("In print_pointer_2 address is : \t\t\t%p\n", &i);
}
所以你只是打印一个局部变量的地址。你宁愿打印 指针的值,因为该指针存储您在main()
中分配给它的地址 printf("In print_pointer_2 address is : \t\t\t%p\n", i);
这会自然地打印j
的地址,而不是主要的i
变量的地址,如
你的print_pointer_1()函数。 print_pointer_2()无法知道main()的i
答案 1 :(得分:1)
首先,为什么不简单:
void print_pointer (void *p) {
printf("In print_pointer address is : \t\t\t%p\n", p);
}
问题:print_pointer_1
将指针作为参数(恰好指向指向int的指针),它作为参数出现。然后打印该指针。到现在为止还挺好。但是您要打印的指针是局部变量i
的地址,该变量没有j
的链接(只有内容有j
的链接,不是地址)。但是,这解释了为什么它与main()
中直接打印的地址相同,因为它们都是i
的地址。
print_pointer_2
将指针作为参数(恰好指向指向int的指针),它作为参数出现。但是,然后你打印那个指针的地址,它将是print_pointer_1
的堆栈帧中的一个地址 - 一个对你没用的地址。它不是main()
中任何内容的地址。你用i
作为参数来调用它,但是你用它来调用它并不重要;它总是打印相同的地址,因为它是您正在打印的参数的地址。
答案 2 :(得分:1)
好的,让我们尝试解释一下这样。 我使用“mem j”来表示分配用于存储变量j的值的内存。 这是您使用“j”时访问的内存。您将获得存储在此内存位置的值。
所以在主要
mem j< - 包含1
mem i< - 包含mem j的地址
您调用“print_pointer_1(& i)”,这意味着您将“print_pointer_1”值“mem i的地址”作为参数。
在print_pointer_1中,您将打印值“mem i的地址”。
然后调用“print_pointer_2(i)”。由于我包含“mem j的地址”,因此这是您传递给“print_pointer_2”的值。
现在为了使这个更简单,让我们再次使用这个实现 对于“print_pointer_2”:
void print_pointer_2(int* myvalue) {
printf("In print_pointer_2 address is : \t\t\t%p\n", &myvalue);
}
所以你打印“mem myvalue的地址”,它与“mem i的地址”无关。所以当然“print_pointer_2”打印的内容与“print_pointer_1”不同; - )。