问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C++为什么要用引用而不是指针

发布网友 发布时间:2022-04-10 10:46

我来回答

4个回答

懂视网 时间:2022-04-10 15:07

Note:

如果具有引用的数组被拷贝,其值不会解除引用。对于数组传值给函数也是如此。

Note:

如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量。

Example #1 对未定义的变量使用引用

<?php
function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b[‘b‘]);
var_dump(array_key_exists(‘b‘, $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, ‘d‘)); // bool(true)
?>

同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中(PHP 4.0.4 以及以后版本):

<?php
$bar =& new fooclass();
$foo =& find_var($bar);
?>
自 PHP 5 起,new 自动返回引用,因此在此使用 =& 已经过时了并且会产生 E_STRICT 级别的消息。

Note:

不用 & 运算符导致对象生成了一个拷贝。如果在类中用 $this,它将作用于该类当前的实例。没有用 & 的赋值将拷贝这个实例(例如对象)并且 $this将作用于这个拷贝上,这并不总是想要的结果。由于性能和内存消耗的问题,通常只想工作在一个实例上面。

尽管可以用 @ 运算符来抑制构造函数中的任何错误信息,例如用 @new,但用 &new 语句时这不起效果。这是 Zend 引擎的一个限制并且会导致一个解析错误。

Warning

如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。

Example #2 在函数内引用全局变量

<?php
$var1 = "Example variable";
$var2 = "";

function global_references($use_globals)
{
    global $var1, $var2;
    if (!$use_globals) {
        $var2 =& $var1; // visible only inside the function
    } else {
        $GLOBALS["var2"] =& $var1; // visible also in global context
    }
}

global_references(false);
echo "var2 is set to ‘$var2‘ "; // var2 is set to ‘‘
global_references(true);
echo "var2 is set to ‘$var2‘ "; // var2 is set to ‘Example variable‘
?>
把 global $var; 当成是 $var =& $GLOBALS[‘var‘]; 的简写。从而将其它引用赋给 $var 只改变了本地变量的引用。

Note:

如果在 foreach 语句中给一个具有引用的变量赋值,被引用的对象也被改变。

Example #3 引用与 foreach 语句

<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
    // do something
}
echo $ref; // 3 - last element of the iterated array
?>

引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量并且该变量在呼叫范围内引用了同一个内容来实现的。例如:

<?php
function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
?>
将使 $a 变成 6。这是因为在 foo 函数中变量 $var 指向了和 $a 指向的同一个内容。更多详细解释见引用传递。

引用做的第三件事是引用返回。

 数组引用的一个bug(后来仔细推敲,其实不是bug)

摘自:http://www.php.net/manual/zh/language.references.whatdo.php

It appears that references can have side-effects.  Below are two examples.  Both are simply copying one array to another.  In the second example, a reference is made to a value in the first array before the copy.  In the first example the value at index 0 points to two separate memory locations. In the second example, the value at index 0 points to the same memory location. 


I won‘t say this is a bug, because I don‘t know what the designed behavior of PHP is, but I don‘t think ANY developers would expect this behavior, so look out.

An example of where this could cause problems is if you do an array copy in a script and expect on type of behavior, but then later add a reference to a value in the array earlier in the script, and then find that the array copy behavior has unexpectedly changed.

  <?php
// Example one
$arr1 = array(1);
echo " before: ";
echo "$arr1[0] == {$arr1[0]} ";
$arr2 = $arr1;
$arr2[0]++;
echo " after: ";
echo "$arr1[0] == {$arr1[0]} ";
echo "$arr2[0] == {$arr2[0]} ";

输出:

before:
$arr1[0] == 1

after:
$arr1[0] == 1
$arr2[0] == 2

// Example two

$arr3=array(1);
$a=&$arr3[0];
echo" before: ";
echo"$a == $a ";
echo"$arr3[0] == {$arr3[0]} ";
$arr4=$arr3;
$arr4[0]++;
echo" after: ";
echo"$a == $a ";
echo"$arr3[0] == {$arr3[0]} ";
echo"$arr4[0] == {$arr4[0]} ";

输出: 

before:
$a == 1
$arr3[0] == 1

after:
$a == 2
$arr3[0] == 2
$arr4[0] == 2

?>

    分析说明:

    对于“Example two”,刚开始还以为是个bug,其实仔细推敲,非也,分析如下,

在赋值(拷贝) 

$arr4=$arr3; 

之前,还有个对$arr3的第一个元素建立引用的过程,即

$a=&$arr3[0];

所以在后来的赋值拷贝( $arr4=$arr3; ),会把这个引用一并拷贝过去,所以说

$a、$arr3[0]、$arr4[0] 三者其实是引用关系,指向同一个地方。 

mysql引用并不是指针

标签:any   link   处理   back   rate   原因   工作   外部   对象   

热心网友 时间:2022-04-10 12:15

 引用与指针区别:引用只是取得数据,无权修改,句柄就是一种引用的方式;指针是直接指向内存的,可以修改数据的。

  引用访问一个变量是直接访问,而指针是间接访问。
  引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
  引用在开始的时候就绑定到了一个内存空间(开始必须赋初值),所以他只能是这个内存空间的名字,而不能改成其他的,当然可以改变这个内存空间的值.
  例如
  int i = 3,j = 4;
  int &x = i;//成为i的别名
  x = j;//不能否认x仍然引用i,并没有成为j的别名,只是修改了x和j共享的内存空间的值.
  这点与指针不同,指针在任何时刻都可以改变自己的指向。

  无法让引用与其指示物分离。
  和指针不同,一旦引用和对象绑定,它无法再被重新指向其他对象。引用本身不是一个对象(它没有标识;当试图获得引用的地址时,你将的到它的指示物的地址;记住:引用就是它的指示物 )。
  从某种意义上来说,引用类似 int* const p 这样的const指针(并非如 const int* p这样的指向常量的指针)。不管有多么类似,请不要混淆引用和指针;它们完全不同。

热心网友 时间:2022-04-10 13:33

习惯问题……用const修饰,那么在你的函数体里就不可以对其进行更改,否则报错!这是为了使有些指针要想被其它函数调用,但又不希望由于失误被其它函数意外更改而设置的。如果你本意就是要做指针的更改,那当然就别加const了。

热心网友 时间:2022-04-10 15:08

简单的说:就是为了安全,为了简便。。因为c++将面临大型程序,必须把安全放在第一位,否则一旦程序庞大到一定程度,如果因某个指针错误而造成的整个程序崩溃,哪怕差错都可能需要几天甚至几周时间了。。c++语言就是c语言走向高级语言的升级版。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么我在电脑上面下的电影在手机上面不显示? 为什么视频在手机里放不出来在电脑里放得出来? 求问bb霜什么牌‍子‍好 BB霜哪个牌子的比较好啊? 我用很多BB霜都过敏脱皮,该用哪个牌子的才能不过敏?拜托了各位 谢谢... 没有去继续教育会计证会不会被吊销? 会计证连续几年未继续教育会被吊销 我想请问,能不能从视频里抓出一段声音,然后保存,变成手机铃声的那种格式... 高中地理知识如何描述地貌特征 中国地理第一讲:自然地理之河流 低速一踩刹车就咯噔响怎么回事? 柴油发电机水从空调管子出来是什么原因? 室内吊顶材料有哪些 关于编辑WORD文档 大金*空调(惠州)有限公司的ZUW400AY1冷水机,在确保水流保护接通及线路正常和有24V电 帮忙翻译一下一篇文章,谢谢 惠州市天一环境工程有限公司怎么样? 惠州恒温舒适家大金中央空调在哪里? 惠州市粤新工程技术有限公司怎么样? 前面打的耳洞,看到了网上说那个一次性打的耳钉两,三天一定要取下来不然会红肿发炎我刚好有点症状? 一次性穿耳器要戴几天? 用一次性穿耳器打耳洞后,一天可以换成透明的吗 一次性打耳洞器多久摘 一次性穿耳器打了耳洞,过了四天准备拿下来,结果发现怎么拽都不下来 企业从事进出口业务需要办理哪些手续?如何进行报关? 公安里为什么支队长比大队长大?为什么叫支队长? 杭州市**委员、*助理是什么级别?(杭州市是副省级城市,市**入常) 杭州公安局 情报中心副主任是什么级别官员 我到快手极速版上买了一个东西,钱都付了。但是找不到商家联系电话,也看... 杭州公安局柯良栋局长的前任是谁 数学高考答题技巧与答题方法是什么? 刹车踩下去咯噔咯噔响并且有顿挫感怎么回事? 我在百度快行订的火车票,我要取消订票问怎么取消 我在百度在线订了火车票怎么退 雪地上踩刹车咯噔咯噔响怎么回事 百度订火车票取消订票 我在百度订的火车票怎么取消 梦见自己结婚了,这梦是好还是不好 卡宴玻璃水能加多少升 我骑电动车用高德地图,我不会用导航怎么玩的啊,求会的朋友教我一下 产品应急预案方案措施 买了个GPS导航不会用 不会看导航丢人不? 发布会策划的应急措施 应急保障措施内容 我的车是新款凯美瑞原车导航,就是不会用导航设定目的地! 我问汽车导航不会用怎么办请回答 手机恢复出厂设置后,导航仍然是不会用 手机腾讯视频退出后,手机桌面上仍有&quot;再按一次退击腾讯视频&quot;的黑色提框 腾讯会议怎么把自己视频画面搞上黑边