相同點:都是變量地址的概念
指針:指向一塊內存,指針自己存的是這塊內存的地址
引用:是這塊內存的別名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