C语言中指针变量的传值和传址

Posted 一口Linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中指针变量的传值和传址相关的知识,希望对你有一定的参考价值。

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("%d\n",*pInt);                                            return 0;
}

原因:在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("%d\n",*pInt);    
   return 0;
}

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

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

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

  • 无论传值还是传指针,函数都会生成一个临时变量,但传引用时,不会生成临时变量,
  • 传值时,只可以引用值而不可以改变值,但传值引用时,可以改变值,
  • 传指针时,只可以改变指针所指的内容,不可以改变指针本身,但传指针引用时,既可以改变指针所指的内容,又可以改变指针本身,
  • 引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

参考书籍《C陷阱与缺陷》


一口君个人微信


添加一口君个人微信即送Linux、嵌入式等独家入门视频


→ 精选技术资料共享

→ 高手如云交流社群






推荐阅读



【1】
【2】
【3】
【必读】

【5】

【6】
【7】
【8】
【9】
【10】


后台回复进群」,即可加入技术交流群,进群福利:免费赠送Linux学习资料




以上是关于C语言中指针变量的传值和传址的主要内容,如果未能解决你的问题,请参考以下文章

函数参数的传值和传指针有什么区别?

再谈js传值和传址

在c语言编程中,传值方式和传引用方式之间有啥区别?

vb当中,参数传递默认方式是传值?传址?还是传址和传值?

C语言 - 结构体初识

C语言的传值与传址调用