c的指针和php中的引用的区别
https://blog.csdn.net/yangfanzn/article/details/44731391
1-php和c中的变量名都会被解析成内存地址,变量名所代表的内存的地址中内容即代表变量的内容,但由于指针的跳转,这个内容往往并不那么明显
2-在c中不同的变量名即代表不同的内存地址,这个是一一对应的,但是在php中不同的变量名可以代表相同的内存地址,这就是php中所谓引用别名的基础,和c的指针很像,却又有差别
3-举个例子,对于变量a变量b,所在内存中都存储变量地址(指针)20011,在c中变量a和变量b的所解析的内存地址一定是不同的,分别是10011和10012,他们都同时指向20011,但是在php中变量a和变量b就是一样的,都是10011,那么自然指向相同的内存地址20011
4-(假设)php中所有内容都不是直接被变量所解析的内存地址所存储,往往都需要进行一轮指针的跳转,原因就是在php中所有的变量都可用被unset以打断变量名所解析的内存地址中真正内容内存地址的连接,当然这个前提假定是变量名解析为内存地址这个过程是不可打断的
5-综上,c中的指针和php中的引用就非常相似,下面就php的具体实现简述差别
-->1.在数组中,数组索引或关联key可用被理解为数组中的变量名,用于在数组中解码为内存地址,在数组中进一步寻址,用unset数组元素,可打断连接,并完全令其在数组中消失,但是在循环中用&value的方式进行unset(value)是无法删除元素的,其打断的只是value与元素的连接,真正数组元素arr['x'/0]并为打断,但是如果value也是数组,就可用unset(value['x'/0])的方式删除元素,次影响会波及最初的数组
-->2.如果数组中的某个元素本身就是某个变量的引用或者别名,那么即使对这个数组进行复制,那么复制后的变量依然保有之前的引用连接,对于此类数组传值给函数也是如此,这里隐含了一点:普通的变量和引用的变量天生就是有区别的,并是可区别的
-->3.如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量。为什么要这么强调?因为这些操作往往都是作为右值出现的,如果右值未定义,一般都是会报错的,但是这里就被自动创建(null),这里的未定义变量,除了一般简单变量外,还包括数组元素和对象属性
---->引用赋值,对象赋值自动引用,无需&
---->引用参数传递,仅在函数定义中有&,函数调用中无&,否则报不推荐警告,变量、new、函数引用返回可用做引用传递,其他任何表达式都不得做函数引用传递
---->函数引用返回,要在两处定义&(函数定义名前、函数调用名前),返回的只能是变量,不能是new或其他任何表达式,这点是和上面不同的,另外返回的变量即可用是静态变量,也可用是局部变量,或私有或公共属性
-->4.特别的不是指针的区别,如果x=&a;x=&b;并不会产生如下步骤,a的指针地址给x,x指向的a获得b的地址,最后使a中存储b的地址内容,当然其实涉及自动化完成的地址取值的过程,如下是php官方例子。总之紧记,php中的引用就是别名,上面和下面的例子,仅仅是别名的变换而已,并不存在指针的赋值取值操作,但是,一般在引用后的单独使用时,二者还是极其相似的
<?php
function foo(&$var)
{
$var =& $GLOBALS["baz"];
}
foo($bar);
?>
c的指针和php中的引用的区别的更多相关文章
- c++中的引用与指针的区别
http://blog.csdn.net/lyd_253261362/article/details/4323691 c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存 ...
- C++ 中指针与引用的区别
指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...
- C++中指针和引用的区别
①指针可以为空,引用不能为空: ②指针可以被赋值,引用必须在声明时赋值,之后不能被赋值: ③指针可以指向堆中空间,引用不能指向堆中空间,如int &p=new int; 会编译出错.
- [ZZ]C++中,引用和指针的区别
(1) 引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针. 由于C++ 要求 reference 总是指向一个对象所以 re ...
- 转贴:C++中指针和引用的区别
从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有 ...
- 浅谈C++中指针和引用的区别者之间的区别和用法(转)
指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个 ...
- 浅谈C++中指针和引用的区别
指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个 ...
- perl5 第十二章 Perl5中的引用/指针
第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用 子程序模板七.数组与子程序八.文件句 ...
- 【C++】C++中的引用与指针
想必大家对C++中的指针都有所了解,但是什么是引用呢?C++11标准引入了“引用”的新功能. 引用 引用(reference):给对象起了另外一个名字,引用类型引用(refers to)另外一种类型, ...
随机推荐
- C++(四十七) — 文件输入、输出流
1.文件输入.输出流 由于文件设备并不像显示器屏幕与键盘那样是标准默认设备,不能像cout那样预先定义的全局对象,所以我们必须自己定义一个该类的对象. ifstream类,它是从istream类派生 ...
- Javascript技能
Javascript技能 说一说我对 Javascript 这门语言的一些总结(适合前端和后端研发) 基本认识 一些心得 思维脑图的链接(icloud 分享): https://www.icloud. ...
- 下载恶意pcap包的网站
说几个我经常用的,免费的:1. Malware Traffic Analysis: http://www.malware-traffic-analysis.net/2018/index.htm ...
- hdu3486Interviewe(二分是错的)(ST算法RMQ + 判定上下界枚举)
题目大意是找最小的m使得前m段中每一段的最大值相加严格大于k,每一段长度为[n/m](n/m向下取整,多余的后半部分部分n-m*[n/m]不要) 先给一段我一开始的思路,和网上许多题解思路一样,但其实 ...
- C#将文件转成16进制码流写入数据库存起来,访问的时候再还原成PDF文件。
转自https://blog.csdn.net/liubowei_0312/article/details/53378146 适合将文件写入数据库,远程访问的时候还原1.首先把文件转成十六进制文件流 ...
- 为什么需要 Redis 哨兵?
在说哨兵之前,我们先说下主从复制,Redis 的主从复制模式,一旦主节点出现故障无法提供服务,需要人工介入手工将从节点调整为主节点,同时应用端还需要修改新的主节点地址,这种故障转移的方式对于很多应用场 ...
- telegraf 学习二 几个概念
telegraf 自身包好了自己处理metrics 的数据模型,以及出炉方法 metrics Telegraf指标是用于在处理期间对数据建模的内部表示.这些指标完全基于InfluxDB的数据模型,包含 ...
- 2-ESP8266 SDK开发基础入门篇--非RTOS版与RTOS版
https://www.cnblogs.com/yangfengwu/p/11071580.html 所有的源码 https://gitee.com/yang456/Learn8266SDKDevel ...
- CSPS_110
永远不要相信出题人诸如“保证图联通”之类的鬼话. T1 最优情况一定为从LR最高的不同位以下全是1 T2 折半搜索 T3 1.我算法不是mlog^2m,最坏情况下mlogm再乘个根号m, 考试的时候没 ...
- 洛谷 P4779 【模板】单源最短路径(标准版) 题解
P4779 [模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 100 ...