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

指针/引用

相同点:都是变量地址的概念
指针:指向一块内存,指针本身存的是这块内存的地址
引用:是这块内存的别名

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

转载于:https://my.oschina.net/u/3798036/blog/3022886

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值