c指针与函数参数传递方式

今天,知道了一个好像醍醐灌顶的东西,大学四年真的学的太少啦。/

首先,已经知道C++中的函数参数传递方式有两种:按值传递和按引用传递。其中按引用传递分为,用引用参数和用指针参数传递。一个变量的引用参数和它指向同一地址,所以用引用参数按引用传递,传递的就是原来的参数,而并不是该参数值的拷贝,也是早就知道的。

那用指针参数传递按引用传递,之前的想法可能有错。

指针,假设

int val = 1;

int *valPtr = &val;

此时,valPtr表示它的内存里面存的是一个int类型的值的地址,即存val这个变量的地址,*valPtr指的是它存的地址里面存的值,就是val的值1,&valPtr就是存valPtr的内存地址。这也是之前明白的。


贴一段代码 来源点击打开链接,就是看了这个才发起疑问的。

void GetMemory(char* p)  
{  
    p = (char*)malloc(100);  
}  
int main()  
{  
    char* str = NULL;  
    GetMemory(str);  
    strcpy(str, "hello world");  
    printf(str);  
    return 0;  
}  


运行会报错,跟进GetMemory()函数,发现p确实会被赋值,不再是NULL,但是执行完后,GetMemoery(str)的str还是为NULL。我以前一直以为说指针也能实现按引用传值,所以GetMemeory()这边应该就是直接是指针str。但是,并不是!从结果上看,就是str的值没有收到影响。所以,其实,GetMemeory(char* p),就是按值传递,p这个时候就是str的一个拷贝,p里面存的是str存的,也就是str指向的内存地址。然后,这俩就没有别的关系。下面,p = (char*)malloc(100); p被赋了一个新值,也就是现在p现在存了一个由malloc函数返回的新的内存地址,但是str的值并没有半点关系。

如果想要达到想要的效果,就应该改掉GetMemory(char* p),改成GetMemory(char* &p)。

那用指针参数的引用传递函数参数是什么鬼呢?就是,当我们传了一个指针(实际上是一个指针的拷贝),当我们用*p时,就能够改变*str,这样就做到的按引用传递,这是因为*p表示的所指内存的值,这和*str相同。

啦啦啦啦啦啦,还是蛮高兴的。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值