指针,引用,值传递,引用传递。各个语言的对比

指针/引用

相同点:都是变量地址的概念
指针:指向一块内存,指针自己存的是这块内存的地址
引用:是这块内存的别名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

相关文章
相关标签/搜索