下面以AS3.0(代表无指针的高级语言)和C++(代表有指针的语言)来比较:
/*函数传值的规律: 基本上适用所有的计算机语言 下面以as语言和C/C++为例:
*
*
* as/java等无指针的高级语言 基本类型 都不承载地址内存(也就是说) 传给函数的值是复制的 而不是直接地址里操作数据
* 而c/C++ 含有指针 对于复杂类型 与基本类型都一样 要想承载数据 需要用指针*p 或者 &adr
* 指针都好说 主要是&adr
* 在C++里函数的声明基本类型和复杂类型都可以承载地址内存 也就是在函数声明的时候加上符号 & 比如 void ok(int &a) void pk( Custom &people)
* 那么以后赋给函数的变量的数据操作就不是在复制数据在操作了 而是直接地址原始数据里操作 因为含有地址&通配符 表示以后的操作都是直接操作地址内存里的数据
*
* 而as里 的复杂数据类型 比如 Sprite 在函数里 function ok (sp:Sprite) 里Sprite 的意思 表示的是不止是Sprite类型 还有内置的& 也就是说能承载地址内存操作!
* 所以在as/java等高级语言里,我们对这些复杂数据类型在函数里的操作是直接操作地址内存里的数据
*
*
*
*
* */
package
{
import flash.display.Sprite;
import flash.events.Event;
/**
* ...
* @author dreamnight
*/
public class Main extends Sprite
{
private var mc1:Sprite;
public function Main() {
mc1 = new Sprite;
mc1.x = 20;
valueChange(mc1.x);
trace(mc1.x);//output:20 说明函数基本类型传值是复制传值 即 复制 实际参数 传给形式参数 《注意:其实参是复制的 所以原来的实际参数的值并没有变化》而不改变实际参数的值
addressChange(mc1);
trace(mc1.x);//output: 100 说明 直接操作的是地址内存里的数据
}
private function valueChange (x:int):void {//基本类型(int )《没有承载地址,即不是直接在存储内存里操作数据》而只能复制数据 , 传递的参数是实际变量的复制值
x = 100;
}
private function addressChange(mc:Sprite):void {//复杂类型《含承载地址》 需要一个地址内存来承载数据 也就是说传来的参数就是实际参数(复杂数据类型)是地址内存里的数据 而非复制来的!
mc.x = 100;
}
}
}
=====================================================================================
C++
/*函数传值的规律: 基本上适用所有的计算机语言 下面以as语言和C/C++为例:
*
*
* as/java等无指针的高级语言 基本类型 都不承载地址内存(也就是说) 传给函数的值是复制的 而不是直接地址里操作数据
* 而c/C++ 含有指针 对于复杂类型 与基本类型都一样 要想承载数据 需要用指针*p 或者 &adr
* 指针都好说 主要是&adr
* 在C++里函数的声明基本类型和复杂类型都可以承载地址内存 也就是在函数声明的时候加上符号 & 比如 void ok(int &a) void pk( Custom &people)
* 那么以后赋给函数的变量的数据操作就不是在复制数据在操作了 而是直接地址原始数据里操作 因为含有地址&通配符 表示以后的操作都是直接操作地址内存里的数据
*
* 而as里 的复杂数据类型 比如 Sprite 在函数里 function ok (sp:Sprite) 里Sprite 的意思 表示的是不止是Sprite类型 还有内置的& 也就是说能承载地址内存操作!
* 所以在as/java等高级语言里,我们对这些复杂数据类型在函数里的操作是直接操作地址内存里的数据
*
*
*
*
* */
#include <iostream>
#include <string>
using namespace std; //使用std里的string 其是命名空间
//void ShowName(Customer people);
typedef struct {
string name ;
int age ;
string sex ;
}Customer;
//注意复杂数据类型操作的都是地址 比如as/java里的 虽然是引用 但是你在改变某个属性值时 实际上也是在操作地址《即操作地址内存里的数据值》
// 所以改变某个复杂数据类型的值 应该从地址处理 也就是指针*P |&address
void ShowName(Customer &people){//这里给的是能承载地址内存的参数,也就是直接在地址内存里操作数据 而不是 (Customer people) (Customer people )表示复制传来的参数
people.age=20;
people.name="张保华";
people.sex="男";
}
void main() {
cout<<"我日"<<"34"<<endl;//<<也有连接的作用 相当于as里的+
cout<<"操你妈"<<endl<<"操"<<endl;//endl表示换行
Customer huazi;//声明一个地址空间
ShowName(huazi);//操作huazi内存里的数据
cout <<endl<<"华子的名字为:" << huazi.name <<endl<< "性别为:" <<huazi.sex<<endl << "年龄为:" << huazi.age << endl;