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. Tensorflow简单实践系列(一):安装和运行

    TensorFlow 是谷歌开发的机器学习框架. 安装 TensorFlow 直接使用 pip 安装即可,添加豆瓣镜像可以加快速度: pip install tensorflow -i https:/ ...

  2. Python 利用函数、列表来实现计算天数

    这几天课程学习了列表的操作,结合以前的函数知识,编写了一个能够判断天数的代码 源码如下 def is_year(year): return year % 4 == 0 and year % 100 ! ...

  3. js Date对象和数字对象

    <script type="text/javascript"> alert(new Date.toLocaleString()); </script> 以本 ...

  4. python SQLAlchemy的简单配置和查询

    背景: 今天小鱼从0开始配置了下 SQLAlchemy 的连接方式,并查询到了结果,记录下来 需要操作四个地方 1. config  ------数据库地址 2.init ----- 数据库初始化 3 ...

  5. Kafka为什么这么快?

    批量处理 传统消息中间件的消息发送和消费整体上是针对单条的.对于生产者而言,它先发一条消息,然后broker返回ACK表示已接收,这里产生2次rpc:对于消费者而言,它先请求接受消息,然后broker ...

  6. Java LinkedList add vs push

    Java LinkedList add 是加在list尾部. LinkedList push 施加在list头部. 等同于addFirst.

  7. 优雅关闭web服务的方式

    优雅关闭web服务 DBHelper, err = gorm.Open("mysql", "root:root@(115.159.59.129:3306)/test?ch ...

  8. 微信小程序知识云开发

    一个小程序最多5个服务类目,一个月可以修改3次类目 小程序侵权投诉的发起与应对 软件著作权作品登记证书 实现小程序支付功能 如何借助官方支付api简单.高效率地实现小程序支付功能 借助小程序云开发实现 ...

  9. Brexit Gym - 101490C

    题目链接:Brexit vector的使用(vector存边),巧用queue,相当于Bfs /* */ # include <iostream> # include <cstdio ...

  10. C Primer Plus--结构和其他数据类型(2)

    目录 枚举类型 enumerated type 枚举默认值 为枚举指定值 命名空间 namespace typedef关键字 * () []修饰符 typedef与这三个运算符结合 函数与指针 函数指 ...