你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

指针变量的传值、传引用

[复制链接]
gaosmile 发布时间:2020-8-11 14:49
1 引言

举个例子:在func函数退出后,指针pInt所指的内容*pInt为 12

#include <stdio.h>
: x: [4 K1 W+ I8 O0 Z//公众号:C语言与CPP编程
0 ?; X6 H3 Q, @" B/ Dint func(int* pRes)- K( A5 N" Q1 m& L9 L9 B
{
0 H# {1 C3 `7 h( _( C2 I' G    if(pRes == NULL)8 P! f, K" L; m) m$ h4 @  R; o
    pRes = new int(12);//分配新的内存空间给指针pRes,并赋值
. A7 V6 R/ b" h8 b    return 0;
4 ^$ a* M# _3 X0 q6 J# V}
3 p) w9 P8 O: Mint main ()! e9 t! N$ l# f7 I4 f3 y9 u
{
: V2 P5 G2 _4 j7 A7 `% L    int *pInt = NULL;6 M: Q3 h" e8 [1 e& P% c; h& r
    int val = func(pInt);
- ~5 m# _7 s8 ~9 C! [    printf("%d\n",*pInt);                                            return 0;
. Q2 q3 @1 N) P- F( ]2 J% A* ?}
# 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$ S
int *p = &v;', @) Z5 z& u0 R  x/ ^, k
int *&rp = p;9 `4 w3 D$ o; h) G

&说明r是一个引用。*确定r引用的类型是一个指针。

因为引用不是对象,故无引用的数组,无指向引用的指针,无到引用的引用:

int& a[5]; // 错误
( y& t, ?. }: m7 rint&* p;   // 错误5 n& Q8 E3 v; i
int& &r;   // 错误

, d0 ?/ ]* h6 `( u. i6 A* G

所以修改函数int func(int* pRes);为int func(int *&pRes);

#include <stdio.h>0 l. x) z) o  y2 a1 E
7 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)
. C: v7 r0 @/ r. Z8 R* J    pRes = new int(12);//分配新的内存空间给指针pRes,并赋值
. l4 G4 j/ }4 ~8 [  K    return 0;
/ g/ @1 |, q0 Z$ e}- F, O  i7 W% q: I1 t
int main ()8 ~/ G* L5 Y- G; l4 u
{
* m) W1 }/ M5 \3 _) ]    int *pInt = NULL;
+ z5 E: E$ ^3 S( t    int val = func(pInt);
0 P) n# L5 _% N; M    printf("%d\n",*pInt);    % z  o, x0 Y4 A8 l
   return 0;
, m: Z: g- \1 `& o; J) z5 [}
. `, P% h5 e/ a
2 传值、传引用区别和联系

传值:实参拷贝传递给形参。就是把实参赋值给形参,赋值完毕后实参就和形参没有任何联系,对形参的修改就不会影响到实参。

传地址:把实参地址的拷贝传递给形参。就是把实参的地址复制给形参。复制完毕后实参的地址和形参的地址没有任何联系,对实参形参地址的修改不会影响到实参, 但是对形参地址所指向对象的修改却直接反应在实参中,因为形参指向的对象就是形参的对象。

传引用:本质没有任何实参的拷贝,两个变量指向同一个对象。这是对形参的修改,必然反映到实参上。

  • 无论传值还是传指针,函数都会生成一个临时变量,但传引用时,不会生成临时变量,
  • 传值时,只可以引用值而不可以改变值,但传值引用时,可以改变值,
  • 传指针时,只可以改变指针所指的内容,不可以改变指针本身,但传指针引用时,既可以改变指针所指的内容,又可以改变指针本身,
  • 引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
    # v& s% R) M, h/ w5 s/ a# C* O6 G4 S3 T
赞 收藏 评论0 发布时间:2020-8-11 14:49

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版