指針,引用,值傳遞,引用傳遞。各個語言的對比

指針/引用

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

賦值

  • c語言中只有值傳遞
    好比結構體也是copy了一份變量
    若是想改變實參的內容,只能用指針
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

相關文章
相關標籤/搜索