您的位置 首页 动态

C/C++中关于部分函数中更新实参指针的办法

在C语言中因为参数的传递方式属于值传递,局部参数在函数内部的改变并不会影响实参的值,有时候为了保存对在函数中的修改,往往采用返回

C++” target=”_blank”>C++言语中因为参数的传递办法归于值传递,局部参数在函数内部的改动并不会影响实参的值,有时分为了保存对在函数中的修正,往往选用回来值或许指向指针的指针的办法来完结,我就选用简略的内存分配来阐明。其间许多初学者都会犯的过错便是第一种完结办法,那是因为咱们没有搞清楚C言语的参数传递办法。

/*过错的完结*/
void getmemory(int *ptr,int size)
{
ptr = (int *)malloc(sizeof(int)*size);
}

/*回来值类型*/
int * getmemory(int size)
{
int *temp = (int *)malloc(sizeof(int)*size);
if(temp != NULL)
{
return temp;
}
return NULL;
}

/*指向指针的指针*/
void getMemory(int **buf,int size)
{
*buf = (int *)malloc(sizeof(int)*size);
}

上面的完结是C言语中关于指针更新的两种办法,这两种办法在一些结构体中运用的也比较多,比方链表,行列等常用的数据结构操作中。这两种完结办法有各自的优缺陷,比方回来值类型,因为在C言语中只能回来一个值,当然也可以选用结构体的办法选用确保完结多类型回来。这时分假如回来了一个指针操作,往往也不便于回来其他重要的信息,比方有时分要回来操作是否成功的标志等,这时分就显得特别不便利,最典型的比如便是在链表头中刺进新的数据时,这时分链表头被更新了,假如直接回来链表头就不能调查当时操作是否完结,并且假如没有都需求回来值来更新链表头,也显得特别不便利。

/*回来值式的链表更新表头操作*/
head = insert_listnode(head,value);

/*自动更新的操作*/
insert_listnode(*head,value);

一般来说,我在写程序的过程中愈加喜爱用第二种办法,这时分就显得第一种特别的不舒服。可是第二种写法也存在一些缺陷,特别是当许多人对指针处于懵懂的期间,很简略呈现过错,因为在函数内部一般操作的目标不是传递进来的参数,而是对参数的解引证,假如对函数调用和指针不是很清楚的情况下,这种写法很简略呈现过错,因为不知道何时是选用(*head)何时选用head,不清楚这一点,代码自然而然就呈现了过错。第一种往往是许多入门级程序员(我之前一般选用的办法)比较喜爱的办法。

在C++中关于函数参数的传递比C言语中有了更多的挑选,其间比较重要的便是引证的引进,引证是一段内存区域的别号,对别号的操作本质上便是对内存自身的操作,这和传值的办法有着本质的差异,有了这种认识。我觉得选用引证的办法完结指针的更新就会愈加的便利,也就可以战胜前面两种办法的缺陷。即占用回来值和在函数内部适宜运用指针适宜运用解引证。

选用简略的比如阐明:

bool getMemory(int * &a, int size)
{
/*本应该选用new完结,可是为了和前面一向,选用malloc完结*/
a = (int *)malloc(sizeof(int)*size);
if(a != NULL)
return true;
else
return false;
}

这时分就很好的完结了在函数内部完结实参指针参数的更新,扼要的剖析一下,因为变量a是一个指针目标的引证,在函数的调用时就发生了引证目标的绑定操作,绑定一旦完结就不会更改了,这时分对变量a的操作本质上便是对指针的操作,如下所示:

int *b;

/*
在调用该函数的时分,相当于发生了绑定操作
int *&a = b;
这时分对a的操作便是对b的操作
在函数内部将a指向了一个新的目标
本质便是将b指向了这个目标
这样就完结了实参指针的更新操作
这种操作不需求注意解引证,并且不会占用回来值
*/
getMemory(b,10);

所以说在C++ 中,多考虑引证的办法作为参数,不仅仅可以防止大数据结构的仿制,有时分也能起到适可而止的效果。我以为这也是C++中引荐运用引证作为参数的原因之一。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/317743.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部