伪军迷祝:建军节快乐!
当调用一个函数时,实际上入参使用的都是副本(除非是引用),指针也不例外。举个例子如:
void func(int a, int * p);
当调用func时无论是a还是p其实传入的都是副本,假设调用func时传给p的值是pt,则p这个pt的副本保存着和pt一样的地址,*p和*pt都是同一地址上的值,改变*p也就改变了*pt。
但是,对p本身的操作是不会影响pt的,例如不能在函数func内部给p动态分配内存,或者使p指向别的地方,因为这只是对p这个副本进行操作,改变了p保存的地址,但是对实际调用func时的入参pt没有任何影响,
如果想改变pt指向的位置,我们可以使用指针的指针,如:
void func(int a, int **ptr);
(对c++而言,还可以用指针的引用,这个更好理解,如: void func(int a, int * &ptr);)
调用func时,在ptr位置需要传入指针的地址&pt。
假设在func内部申请了内存(m类型为 int *):
m = malloc(size);
想让pt指向这块新申请的内存,可以这样:
*ptr = m;
ptr类型为int **,pt是一个指针,所以pt的值是一个地址,假设该值为addr1,pt所在位置的地址为addr2,而指针的指针ptr的地址为addr3,这个地址上保存的是pt这个指针所在位置的地址addr2,
因此,对ptr解除引用*ptr即为ptr保存的地址addr2上的值addr1(即pt),
因此
*ptr = m;
即等价于:
pt = m;
也就让pt指向了一块新内存。
原文:https://www.cnblogs.com/tan-wm/p/13413921.html