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中的引用的区别的更多相关文章

  1. c++中的引用与指针的区别

    http://blog.csdn.net/lyd_253261362/article/details/4323691 c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存 ...

  2. C++ 中指针与引用的区别

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...

  3. C++中指针和引用的区别

    ①指针可以为空,引用不能为空: ②指针可以被赋值,引用必须在声明时赋值,之后不能被赋值: ③指针可以指向堆中空间,引用不能指向堆中空间,如int &p=new int; 会编译出错.

  4. [ZZ]C++中,引用和指针的区别

    (1) 引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针. 由于C++ 要求 reference 总是指向一个对象所以 re ...

  5. 转贴:C++中指针和引用的区别

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有 ...

  6. 浅谈C++中指针和引用的区别者之间的区别和用法(转)

    指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个 ...

  7. 浅谈C++中指针和引用的区别

    指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个 ...

  8. perl5 第十二章 Perl5中的引用/指针

    第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用  子程序模板七.数组与子程序八.文件句 ...

  9. 【C++】C++中的引用与指针

    想必大家对C++中的指针都有所了解,但是什么是引用呢?C++11标准引入了“引用”的新功能. 引用 引用(reference):给对象起了另外一个名字,引用类型引用(refers to)另外一种类型, ...

随机推荐

  1. LGOJP2051 [AHOI2009]中国象棋

    比较明显的计数dp.不知道为什么被打了状压的tag... 不难发现无论炮放在哪里其实是等价的,需要知道的只有这一列放了一个炮还是两个炮还是还没放,那么可以设\(f[i,j,k]\)表示第\(i\)行, ...

  2. jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class

    java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...

  3. python Thread 函数

    构造方法: Thread(group=None, target=None, name=None, args=(), kwargs={})  group: 线程组,目前还没有实现,库引用中提示必须是No ...

  4. 实用Golang库

    框架: 1. Golang轻量级并发服务器框架: zinx / https://www.jianshu.com/p/23d07c0a28e52. 国内谢大牛模仿django制作的重框架: beego3 ...

  5. centos7安装yum安装pip

    pip是python中的一个包管理工具,可以对Python包的查找.下载.安装.卸载的作用. yum -y install epel-release yum -y install python-pip ...

  6. P2915 [USACO08NOV] Mixed Up Cows

    题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a unique serial number S_i (1 <= S_i & ...

  7. Spring Security 认证执行流程

    本文基于 Spring Security 5.x 推荐阅读: 项目集成Spring Security SpringSecurity 整合 JWT 一.外层-正常登陆调用 项目启动后会自动寻找 User ...

  8. circus 进程以及socket 管理工具&&docker运行

    circus 是由mozilla 团队开发基于python 以及zeromq 的进程以及socket 管理的工具,类似supervisord 但是比supervisord 更灵活方便 来自官方的使用比 ...

  9. DotNetty 常用库

    https://github.com/Azure/DotNetty DotNetty中几个重要的库(程序集): DotNetty.Buffers: 对内存缓冲区管理的封装. DotNetty.Code ...

  10. Win10远程连接自己的电脑提示“登陆没有成功”的解决方案

    问题:提示登录没有成功 猜想: 1)要么是账号密码输入错误,必须是系统的用户名.密码 2)要么是配置问题,配置解决如下: 1.开启允许访问远程 找到此电脑-右键属性-高级系统设置-远程-勾选允许远程连 ...