|
1 引言 举个例子:在func函数退出后,指针pInt所指的内容*pInt为 12 #include <stdio.h>//公众号:C语言与CPP编程 int func(int* pRes)- K( A5 N" Q1 m& L9 L9 B { if(pRes == NULL)8 P! f, K" L; m) m$ h4 @ R; o pRes = new int(12);//分配新的内存空间给指针pRes,并赋值 return 0; } int main ()! e9 t! N$ l# f7 I4 f3 y9 u { int *pInt = NULL;6 M: Q3 h" e8 [1 e& P% c; h& r int val = func(pInt); printf("%d\n",*pInt); return 0; }# G. b1 h( v- j7 K2 }, K7 Z 解析:int func(int* pRes)函数的形参是指针类型 int *pRes,在函数体中 new了一块内存并赋值 12,将内存地址赋值给指针 pRes。在main函数中,定义了指针pInt,调用func函数,把pInt作为参数传入func函数中。结果*pInt并不是 12。 原因:在func函数调用过程中,形参和实参的传递使用了值传递方式,这种情况下,形参变量在函数体内发生了变化,在函数结束之后,形参变量随之释放,不能把变化的结果返回给实参。 可以使用指针传递或者引用传递。想要在函数体内改变pRes的值,并把这个变化返回到main函数中,必须传递pRes的指针。因为pRes本身就是指针,所以应该传递指针的指针,或者指针的引用。 指针的引用int v = 1;# M$ L) g! X: y2 Y7 `2 F) p$ Sint *p = &v;', @) Z5 z& u0 R x/ ^, k int *&rp = p;9 `4 w3 D$ o; h) G &说明r是一个引用。*确定r引用的类型是一个指针。 因为引用不是对象,故无引用的数组,无指向引用的指针,无到引用的引用: int& a[5]; // 错误int&* p; // 错误5 n& Q8 E3 v; i int& &r; // 错误 所以修改函数int func(int* pRes);为int func(int *&pRes); #include <stdio.h>0 l. x) z) o y2 a1 E7 k1 Z0 I0 s0 V7 N int func(int* &pRes)3 P7 m; X, j+ N- ]; Y {: u% P7 v7 ^8 Z. f) R0 W. M if(pRes == NULL) pRes = new int(12);//分配新的内存空间给指针pRes,并赋值 return 0; }- F, O i7 W% q: I1 t int main ()8 ~/ G* L5 Y- G; l4 u { int *pInt = NULL; int val = func(pInt); printf("%d\n",*pInt); % z o, x0 Y4 A8 l return 0; }. `, P% h5 e/ a 2 传值、传引用区别和联系 传值:实参拷贝传递给形参。就是把实参赋值给形参,赋值完毕后实参就和形参没有任何联系,对形参的修改就不会影响到实参。 传地址:把实参地址的拷贝传递给形参。就是把实参的地址复制给形参。复制完毕后实参的地址和形参的地址没有任何联系,对实参形参地址的修改不会影响到实参, 但是对形参地址所指向对象的修改却直接反应在实参中,因为形参指向的对象就是形参的对象。 传引用:本质没有任何实参的拷贝,两个变量指向同一个对象。这是对形参的修改,必然反映到实参上。
|
微信公众号
手机版