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. 如何确定C++继承层次中的函数调用

    ```cpp //============================================================================ // Name : TS.c ...

  2. Codeforces G. Nick and Array(贪心)

    题目描述: Nick had received an awesome array of integers a=[a1,a2,…,an] as a gift for his 5 birthday fro ...

  3. Kotlin调用Java程序重点分析

    在上一次https://www.cnblogs.com/webor2006/p/11530801.html中学习了Kotlin调用Java的使用方式及一些注意点,这次继续其这个场景进一步学习. 数组( ...

  4. Python开发应用-正则表达进行排序搜索

    re模块提供了3个方法对输入的字符串进行确切的查询,match和search最多只会返回一个匹配条件的子串,可以理解为非贪婪模式,而findall会返回N个匹配条件的子串,可以理解为贪婪模式 re.m ...

  5. wordpress更新出现Briefly unavailable for scheduled maintenance. Check back in a minute.

    今天ytkah在更新wordpress插件时出现了Briefly unavailable for scheduled maintenance. Check back in a minute.查找了相关 ...

  6. redis node 常用命令

    命令窗口 flushall //清空全库 keys * //查看所有 HMSET user1 name liujinyu age 25 //哈希 添加多个值 HSET user1 sex man // ...

  7. Centos7安装HBase1.4

    准备 1.hadoop集群已安装,这里将在Centos7安装Hadoop2.7的基础上安装hbase1.4,所以是同样的三台机器,其规划如下: hostname IP地址 部署规划 node1 172 ...

  8. [Go] Slices vs Array

    It is recommended to use 'slice' over 'Array'. An array variable denotes the entire array; it is not ...

  9. 初版javascript的思维导图

  10. learning java Encoder and Decoder

    import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharacterCodingExcep ...