zoukankan      html  css  js  c++  java
  • 从汇编层面解析一传值操作

      C语言代码如下:
    #include <stdlib.h>
    #include "stdafx.h"
    #include "stdio.h"
    #include <string.h>
    #include <malloc.h>
     
    void GetMemory(char * & pBuf,int Bufsize){
        pBuf=(char *)malloc(sizeof(char)*Bufsize);
        memset(pBuf,0x00,Bufsize);
    }
     
    void main(int argc,char * argv[])
    {
        char * pszBuf=NULL;
        GetMemory(pszBuf,50);
        strcpy(pszBuf,"h");
        printf ("%s ",pszBuf);
     
        printf ("hello world! ");
    }
      上面代码中,pszBuf是指针,GetMemory函数的第一个参数pBuf也是指针,它加了个&,程序才能正常运行下去,为什么呢?猜测&起引用的作用。从汇编方面看。
      在GetMemory行加上断点(VC6.0),点击F5执行。可知它先存储参数50,再存入参数pszBuf的地址。如下图所示。
      进入GetMemory函数中。根据函数调用知识,可知【ebp+0Ch】存储的是第二个参数50。【ebp+8】存储的是第一个参数即指针pszBuf的地址,如下图所示。0019ff3c是pszBuf指针的地址,它存储的00431290即此指针指向的内存。

      接下来是初始化语句。此时已经将pszBuf指向的地址联系到分配的地址块中,所以顺利初始化。
      返回到主函数中,可知在执行strcpy函数时,压入的第一个参数是待存入字符串“h”。另一个参数是已初始化内存块的首地址,即pszBuf指向的地址。如下图所示。
      好,此时可猜测知pBuf和pszBuf都是指针,但通过“&”,pBuf变成了pszBuf的引用,即成为它的别名,那对它操作就等同于对pszBuf操作,愉快地结束。
     
    知识点总结:
    函数的参数定义中的【&】是引用的意思,它可以设置普通变量的引用,也能设置指针的引用。
     
     
  • 相关阅读:
    12.python中的列表
    11.python中的元组
    10.python中的序列
    9.python的布尔类型与流程控制
    8.python中的数字
    7.python字符串-内置方法分析
    Boost--lexical_cast 一个方便安全高效的string转换库
    STL进阶--vector vs deque
    STL进阶--删除元素
    STL进阶--相等 vs 等价 (Equality vs Equivalence)
  • 原文地址:https://www.cnblogs.com/HYWZ36/p/10298748.html
Copyright © 2011-2022 走看看