<返回更多

c语言指针变量的传值和传址

2020-08-12    
加入收藏
指针变量的传值和传址

 

1 引言

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

#include <stdio.h>
//公众号:C语言与CPP编程
int func(int* pRes)
{
    if(pRes == NULL)
    pRes = new int(12);//分配新的内存空间给指针pRes,并赋值 
    return 0;
}
int main ()
{
    int *pInt = NULL;
    int val = func(pInt);
    printf("%dn",*pInt);                                            return 0;
}

解析:int func(int* pRes)函数的形参是指针类型 int *pRes,在函数体中 new了一块内存并赋值 12,将内存地址赋值给指针 pRes。在main函数中,定义了指针pInt,调用func函数,把pInt作为参数传入func函数中。结果*pInt并不是 12。

原因:在func函数调用过程中,形参和实参的传递使用了值传递方式,这种情况下,形参变量在函数体内发生了变化,在函数结束之后,形参变量随之释放,不能把变化的结果返回给实参。

可以使用指针传递或者引用传递。想要在函数体内改变pRes的值,并把这个变化返回到main函数中,必须传递pRes的指针。因为pRes本身就是指针,所以应该传递指针的指针,或者指针的引用。

指针的引用

int v = 1;
int *p = &v;'
int *&rp = p;

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

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

int& a[5]; // 错误
int&* p;   // 错误
int& &r;   // 错误

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

#include <stdio.h>

int func(int* &pRes)
{
    if(pRes == NULL)
    pRes = new int(12);//分配新的内存空间给指针pRes,并赋值 
    return 0;
}
int main ()
{
    int *pInt = NULL;
    int val = func(pInt);
    printf("%dn",*pInt);    
   return 0;
}

2 传值、传引用区别和联系

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

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

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

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>