函数调用的本质以及和不同语言间的比较

下面以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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值