int i = 0, j = 1;
void func(int *p, int *q)
{
p = q; //Here the address of p and q are made same.
* p = 2; // value @ address pointed by 'p'(which is q) is now set to 2.
}
int main() //Start of Main
{
func(&i, &j);
printf("%d %d n", i, j);
return 0;
}
when address held in p and q are same , i'm not understanding why the output isn't same as well (2 2).
</code>
If i fire up gdb i see the following
(gdb) p &p
$4 = (int **) 0x7fffffffebc8 <<Actual address of var p (gdb) p &q
$6 = (int **) 0x7fffffffebc0 << Actual address of var q (gdb) n 17 }
(gdb) p p
$8 = (int *) 0x601040 <j> << After the func ends its pointing only to 'j'
(gdb) p q
$9 = (int *) 0x601040 <j>
这与main()
和func()
之间的堆栈不同有关吗?
据我所知指向'i'
的地址被'j'
覆盖了吗?
任何人都可以纠正我的理解吗?
答案 0 :(得分:1)
在C中,参数作为副本传递。因此.then()
和p
是在q
中传递的原始地址&i
和&j
的副本。因此,当您这样做时:
func(&i, &j);
p = q; //Here the address of p and q are made same.
和p
现在确实相同,都是q
的地址。因此,当您这样做时:
j
它将* p = 2; // value @ address pointed by 'p'(which is q) is now set to 2.
指向的内容(即p
)设置为j
。
2
完全没有被修改,因此仍然是i
。您将地址0
作为参数i
传递,但是当您将p
设置为p
时,您立即丢弃了该地址。
答案 1 :(得分:0)
最初在Global范围内,i和j值分别为0和1。函数调用时,传递了i和j的地址(位置)。
Here,
*p = i,
*q = j;
在函数callee中,p和q保留i和j的地址。
分配时,p = q
。 q被分配给p,这意味着p也保存着j的地址。然后,*p = 2
设置p指向的地址的值。 p当前指向j。因此在打印时j的值为2,i的值保持不变。在这种情况下,我们没有任何指向i的指针。我们仅通过i修改i值。
希望这会有所帮助:)