相同点:都是变量地址的概念
指针:指向一块内存,指针自己存的是这块内存的地址
引用:是这块内存的别名php
c:java
int a = 10; int *b = &a; *b = 5; int *c = &b; // warning int* => int ** *c = 1; // 错误的用法,改变不了a的值
php:c++
$a = 10; $b = &$a; $b = 5; $c = &$b; $c = 1; echo $a; // 输出1,a,b,c这三个变量都是那块内存的别名
c++数组
int a = 10; int &b = a; b = 5; std::cout<<a<<std::endl; // 输出5
c语言没有引用,php,c++有指针
struct_a go = {1}; func(go); void func(struct_a a){ a.b = 10; // 并不会改变外边go的内容 }
java中只有值传递,额外的class是复制引用副本code
php中&为值传递,额外的class赋值和java同样,都是复制的引用副本blog
$a = new MyClass(); $a->a = 10; $b = $a; $b->a = 5; echo $b->a; // 输出5,$b是
值得注意的是数组,虽然说都是值传递,但表现不同
c:内存
int a[5] = {1,2,3,4,5}; int *b = a; b[0] = 10; printf("%d\n",a[0]); // 输出10
php:class
$a = [1,2,3,4,5]; $b = $a; $b[0] = 10; echo $a[0]; // 输出1
java:变量
int[] a = {1,2,3,4,5}; int[] b = a; b[0] = 10; System.out.println(a[0]); // 输出10
c语言中a表示的是数组a[5]的第一个变量的地址,因此赋值得用指针int *p
php中$b=$a那就是纯粹的值传递,把数组$a copy了一份
例子:
php: 输出5
c++: 输出10
java: 输出5
php: 输出5
c++: 输出5
java: 输出10