指针/引用
相同点:都是变量地址的概念
指针:指向一块内存,指针本身存的是这块内存的地址
引用:是这块内存的别名
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++
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是复制引用副本
-
php中&为值传递,额外的class赋值和java一样,都是复制的引用副本
$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]; // 输出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