闲来无事,对比一下以前学过的java和C++,记上一笔,以防以后忘记吧!
java分为基本类型和对象传递,对于基本类型的传递属于值复制的情况;而对于对象传递,修改的就是对象本身了。几种基本类型也有自己对应的类,例如int对应Integer这样子。String不是基本类型,传递的是对象,但是String需要注意的是immutable的,所以对于它的处理不能改变它本身,只可以重新赋给一个新String来改变值。
而C++的参数传递更复杂,在我看来主要是有两种,一种是值复制的情况(指针传递也可以看成值复制,不过传递的值是地址而已),另一种是引用传递(相当于变量的一个别名)。C++的指针其实就是内存中的一块地址而已。看到的一个比较好的例子是下面的例子:
#include "stdafx.h"
#include <iostream>
using namespace std;
//值传递
void swap1(int p,int q)
{
int temp;
temp=p;
p=q;
q=temp;
}
//指针传递,函数体内只有指针值的变化
void swap2(int *p,int *q)
{
int temp;
temp=*p;
*p=*q;
*q=temp;
}
//指针传递,函数体内只有指针的变化
void swap3(int *p,int *q)
{
int *temp;
temp=p;
p=q;
q=temp;
}
//引用传递,a的别名是p,b的别名是q
void swap4(int &p,int &q)
{
int temp;
temp=p;
p=q;
q=temp;
}
int main()
{
int a=1,b=2;
swap1(a,b);
swap2(&a,&b);
swap3(&a,&b);
swap4(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}
只有swap2和swap4可以做到交换值。可以画栈中的示意图,牢记住指针其实就是地址!!!!!
对于内存中的地址分配,我觉得C++和Java是一样的,当然,这只是我自己短浅的认为。局部变量都是存储在栈当中,而动态变量则是存储在堆当中。