2012-12-18 60 views
0

这是我教科书中问题的一部分。我无法弄清楚它究竟做了什么以及它是如何做到的,所以我一直在寻求帮助。这段代码片段做了详细的介绍吗?

int a = 5, b[] = {1, 2, 3, 4, 5}; 
int *ptr1, *ptr2; 
void *ptr3; 
ptr1 = &a; 
ptr2 = b; 
ptr3 = (int*) &ptr2; 

我不明白这行

ptr3 = (int*) &ptr2;

我最好的猜测是,ptr3被指定为一个INT指针现在指向同一个地址ptr2点到现在,这是数组b。所以基本上ptr3 = b

这是正确的吗?有人可以解释吗?

+0

什么课本是? – cnicutar

+0

为什么不尝试gdb(或某些调试器)。 – Rohan

+0

@cnicutar说实话,我不知道哪本教科书。你为什么要问? –

回答

4

*&ptr2给出了指针ptr2的地址。尽管ptr2指向与b相同的位置,即该阵列中第一个int的地址,但ptr3将指向存储b中的地址的ptr2的位置。这意味着它在那个时刻成为int**

有点像这样,虽然要小心,PTR2和B具有相同的价值,但在内存中是不同的:

ptr3 -> ptr2 -> 1,2,3,4,5

  `b /^` 

然后代码继续投是一个int *为原因,这些原因并不合理,并且在void *的分配中使用。对我来说看起来相当错误。无论你在哪里找到它,都忘记那个来源。

+0

”这个时候它变成了一个int **。“ - 这不是考虑事情的好方法。请注意'&x'的类型是' *',所以既然'ptr2'的类型是'int *','&ptr2'的类型就是'int **'。这是一个严格的静态(编译时)概念;没有“成为”涉及。 –