指针/引用
相同点:都是变量地址的概念
指针:指向一块内存,指针本身存的是这块内存的地址
引用:是这块内存的别名
c:
int a = 10;
int *b = &a;
*b = 5;
int *c = &b; // warning int* => int **
*c = 1; // 错误的用法,改变不了a的值
php:
$a = 10;
$b = &$a;
$b = 5;
$c = &$b;
$c = 1;
echo $a; // 输出1,a,b,c这三个变量都是那块内存的别名
赋值
c语言中只有值传递
比如结构体也是copy了一份变量
如果想改变实参的内容,只能用指针
struct_a go = {1};
func(go);
void func(struct_a a){
a.b = 10; // 并不会改变外边go的内容
}
php中class是引用传递,其他都是值传递
$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:
$a = [1,2,3,4,5];
$b = $a;
$b[0] = 10;
echo $a[0]; // 输出5
c语言中a表示的是数组a[5]的第一个变量的地址,所以赋值得用指针int *p
php中$b=$a那就是纯粹的值传递,把数组$a copy了一份