精华内容
下载资源
问答
  • #include <iostream> using namespace std; int main() { void swap(int *p1,int *p2); int *pointer_1,*pointer_2,a,b; cin>>a>>b; pointer_1=&a; pointer_2=&...
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        void swap(int *p1,int *p2);
        int *pointer_1,*pointer_2,a,b;
        cin>>a>>b;
        pointer_1=&a;
        pointer_2=&b;
        if(a<b)
        {
            swap(pointer_1,pointer_2);
        }
        cout<<"max="<<a<<" min="<<b<<endl;
        return 0;
    }
    
    void swap(int *p1,int *p2)
    {
        int temp;
        temp=*p1;
        *p1=*p2;
        *p2=temp;
    
    
        void exchange(int *,int *,int *);
        int a,b,c,*p1,*p2,*p3;
        cin>>a>>b>>c;
        p1=&a;
        p2=&b;
        p3=&c;
        exchange(p1,p2,p3);
        cout<<a<<" "<<b<<" "<<c<<endl;
        return 0;
    }
    void exchange(int *q1,int *q2,int *q3)
    {
        void swap(int *,int *);
        if(*q1<*q2)swap(q1,q2);
        if(*q1<*q3)swap(q1,q3);
        if(*q2<*q3)swap(q2,q3);
    }
    void swap(int *pt1,int *pt2)
    {
        int temp;
        temp=*pt1;
        *pt1=*pt2;
        *pt2=temp;
    }
    
    
    展开全文
  • #include int Add(int a,int b) { int z=0; z=a+b; return z; } int main() { int a=3; int b=5; int ret=0;...编写一段简单的代码用来理解主函数在调用函数过程栈空间的使用情况。 将编码转
    #include<stdio.h>
    int Add(int a,int b)
    {
        int z=0;
        z=a+b;
        return z;
    }
    int main()
    {
        int a=3;
        int b=5;
        int ret=0;
        ret=Add(a,b);
        return 0;
    }

    编写一段简单的代码用来理解主函数在调用函数过程中栈空间的使用情况。
    将编码转为汇编代码,我们来一步一步分析。
    在开始之前,首先要知道esp和ebp的作用:
    •esp表示一个指针:该指针永远指向已经使用的栈空间的栈顶。
    •ebp表示一个指针:该指针永远指向已经使用的栈空间的栈底。
    (栈空间的使用是从高地址向低地址使用的)
    •调用mainSRTStartup()函数
    在进入主函数之前,会先调用mainSRTSartup()函数。
    在mainSRTStartup()函数调用完成后,栈空间的使用情况如下:
    •进入main()主函数
    这里写图片描述
    可以看到,在进入主函数之后,并没有直接创建变量。
    push ebp —>压栈(将ebp的地址存入esp所指向位置的上面4个字节内)
    这里写图片描述
    move ebp esp—>让ebp指向esp所指向的位置
    这里写图片描述
    sub 0D8h—>让esp指向esp减去0D8h(十六进制数字)的位置
    这里写图片描述
    push ebx(寄存器)
    push esi(寄存器)
    push edi(寄存器)
    这里写图片描述
    lea edi,[ebp-0D8h]—>把[ebp-0D8h]的地址存入edi中
    mov ecx,36h—>将36h(十六进制数字)存入ecx中
    mov eax,0CCCCCCCCh
    rep stos dword ptr es:[edi]
    从edi这个位置开始,重复做一件事情(重复ecx(36h)次):将eax(0CCCCCCCCh)的内容存储到edi中存储的地址([ebp-0D8h])开始的向上的位置里去。—(初始化内存空间)
    这里写图片描述
    •开始执行主函数语句
    这里写图片描述
    上图汇编代码为vs2013环境下的汇编代码,以下讲解使用vc6.0的环境下的编译代码进行讲解。

     int a=3;
     int b=5;
     int ret=0;

    mov dword[ebp-4],3—>将3存入[ebp-4]所指向的内存空间内
    mov dword[ebp-8],5—>将5存入[ebp-8]所指向的内存空间内
    mov dword[ebp-12],0—>将0存入[ebp-12]所指向的内存空间内
    这里写图片描述
    •调用Add()函数
    mov eax,dword ptr[ebp-8]—>将[ebp-8]中放的内容存入eax中(寄存器),此时[ebp-8]中的内容为5
    push eax—>在栈顶开辟新的空间(4个字节)来存放5
    mov ecx,dword ptr[ebp-4]—>将[ebp-4]中放的内容存入ecx中(寄存器),此时[ebp-4]中的内容为3
    push ecx—>在栈顶开辟新的空间(4个字节)来存放3
    这里写图片描述
    call @ILT+5(_Add)(013B11EFh)—>函数调用
    从013B1B04这个位置直接跳转到013B11EFh所指向的位置(在操作系统中,此过程被称为“现场保护”)此时main()函数并没有结束,只是停在了013B1B04这个位置,等待Add()函数执行完毕之后,main()函数会从013B1B04这个位置继续向下执行。此时在栈顶又会开辟新的空间(4字节),用来存放013B1B04这个地址。

    这里写图片描述
    jmp Add(013B11EFh)—>跳入Add()函数的内部
    这里写图片描述
    开始执行函数语句之前,Add()函数做了与main()函数一样的工作。
    ※所以推断出在每一次函数调用开始的时候都要为这个函数开辟一段空间(运行时堆栈/函数栈帧)。
    此时的内存使用情况为:
    这里写图片描述
    底部绿色的ebp为main()函数的栈底地址,是因为当一个函数被调用完毕时必须回到上一个函数中去,所以就要保存上一个函数的栈底地址。
    •开始执行Add()函数语句

    int z=0;
    z=a+b;
    return z;

    所对应的汇编代码如图所示:
    这里写图片描述
    mov dword ptr[ebp-4],0—>将0存入[ebp-4]的位置
    mov eax,dword ptr[ebp+8]—>将ebp+8中的内容存入eax(eax此时存储的是b的值5)中
    add eax,dword ptr[ebp+0Ch]—>将a与b的值相加并存放在eax中
    mov dword ptr[ebp-4],eax—>将此刻eax的值(8)放到[ebp-4]的位置里去
    mov eax,dword ptr[ebp-4]—>又把[ebp-4]中的值放到eax中去,因为当函数调用完成时,所使用的内存会返还给电脑,但是寄存器不会。
    pop edi
    pop esi
    pop ebx
    上面三句汇编代码会令esp的位置返回,此时esp指向的位置如图所示:
    这里写图片描述
    即图片中紫色esp所指向的位置。
    mov esp,ebp—>把ebp的值赋给给esp(令esp返回)。如图所示:
    这里写图片描述
    pop ebp—>出栈,将原来栈中的元素放入上一个函数的ebp中,(令ebp指向的位置回到上一个函数的栈底),此时esp也会因为ebp的出栈而返回四个字节。如图所示:
    这里写图片描述
    即为图中紫色ebp所指向的位置。
    函数执行到这一步时,图中紫色esp向上的空间(即为为Add()函数所开辟的空间)已经返还给了操作系统。
    ret —>直接跳回call指令的下一条指令(是由紫色esp向下四个字节所保存的地址(013B1B04)找到call指令的下一条指令),此时esp返回四个字节,保存地址(013B1B04)的四个字节也被返还给操作系统。此时的esp和ebp所指向的位置如图所示:
    这里写图片描述
    即为图中紫色esp与紫色ebp所指向的位置。
    接下来的汇编代码如图所示:
    这里写图片描述
    add esp,8—>给esp加8,让esp返回8个字节,如图所示:
    这里写图片描述
    易知,紫色esp以上的位置都会被返还给操作系统,所以此时为Add()函数创建的形参不可以再继续使用。
    mov dword ptr[ret],eax—>将eax中的值(8)保存到ret所在的4个字节中去。
    这里写图片描述
    xor eax,eax—>将eax清零。

    展开全文
  • 在主函数中调用其它函数

    千次阅读 2012-10-24 16:03:37
    目的:在主函数中调用其它函数 */ # include using namespace std; void printstar(void); void print_message(void); int main() { printstar(); print_message(); printstar
    /*
    时间:2012年10月15日10:47:20
    目的:在主函数中调用其它函数
    */
    
    # include <iostream>
    
    using namespace std;
    
    void printstar(void);
    void print_message(void);
    
    int main()
    {
    	printstar();
    	print_message();
    	printstar();
    	
    	return 0;
    }
    
    void printstar(void)//定义printstar函数
    {
    	cout<<"**********************************"<<endl;
    }
    
    void print_message(void)//定义print_message函数
    {
    	cout<<"           Welcome to C++!"<<endl;
    }
    
    /*
    在vc++6.0中运行的结果是:
    ------------------------
    **********************************
               Welcome to C++!
    **********************************
    ------------------------
    */
    

    展开全文
  • 在主函数中,比如要调用 OnReceiveData(digiData,digiDataLen)函数, digiData为串口数据指针,digiDataLen为长度 调用此接收数据函数后,返回值为void。 但是我在接下来的函数调用中需要用到接收数据函数中的一个p...
  • 定义一个函数copy_string实现字符串复制功能,在主函数中调用函数 1. 形参为字符数组 #include <stdio.h> void copy_string(char from[], char to[]); //函数调用 int main() { char a[20]="i love you"; ...

    定义一个函数copy_string实现字符串复制功能,在主函数中调用该函数

    1. 形参为字符数组

    #include <stdio.h>
    
    void copy_string(char from[], char to[]);	//函数调用
    
    int main() {
        char a[20]="i love you";
        char b[20]="you dont love me";
        printf("string a =%s\nstring b = %s", a, b);
        printf("\ncopy a to b:\n");
        copy_string(a,b);   //调用函数
        printf("string a = %s\nstring b = %s\n", a, b);
        return 0;
    
    }
    
    void copy_string(char from[], char to[]) {  //形参为字符数组
        int i;
        for (i = 0; from[i] != '\0'; i++) {
            to[i] = from[i];
        }
        /*while (from[i]!='\0'){
            i++;
        }*/
        to[i] = '\0';   //字符结束
    }
    

    结果:

    string a =i love you
    string b = you dont love mecopy a to b:
    string a = i love you
    string b = i love you
    
    

    注意:a字符数组复制到b字符数组中结束标志’\0’也复制到当中去了。因为b中原来的字符比a长,所以a中的字符不会完全覆盖b,b最后的字母也还在,但是因为输出的格式是%s,遇到空格之后就不会在输出。

    2.形参是字符数组,实参是指针变量
    在main函数中定义字符指针*from,*to分别指向a,b的首地址。
    函数部分不变。

    #include <stdio.h>
    
    void copy_string(char from[], char to[]);
    
    int main() {
        char a[]="i love you";  //定义数组a,b并进行初始化
        char b[]="you dont love me";
        char *from=a,*to=b; //from指向a的首元素,to指向b的首元素
        printf("string a =%s\nstring b = %s", a, b);
        printf("\ncopy a to b:\n");
    
        copy_string(from,to);   //调用函数
        printf("string a = %s\nstring b = %s\n", a, b);
        return 0;
    
    }
    
    void copy_string(char from[], char to[]) {  //形参为字符数组
        int i;
        for (i = 0; from[i] != '\0'; i++) {
            to[i] = from[i];
        }
        /*while (from[i]!='\0'){
            i++;
        }*/
        to[i] = '\0';   //字符结束
    }
    

    ISO C++11 does not allow conversion from string literal to 'char *:

    翻译:isoc11不允许从字符串文字转换为“char*”
    解决:

    • 将指针转换为char const 类型
      char const
      a= “I an a teacher”;
    • 将字符串强制转换为char*类型
      char a= (char)“I an a teacher”;
      由于C++11并没有取消强制类型转换,这样也可以正常编译。但这样和隐式类型转换本质上是相同的,依旧有可能发生所谓错误。建议使用例一的方法。
      3.形参实参都是指针变量
    #include <stdio.h>
    void copy_string(char from[],char to[]);
    int main(){
        char *a= (char*)"I an a teacher";
        char b[] = "you are a student";
        char *p = b;    //定义一个指针变量指向b的首地址
        printf("string a=%s\nstring b=%s\n",a,b);
        printf("copy a to b is:\n");
        copy_string(a,p);   //调用函数实参为指针变量
        printf("copy string b = %s\n",b);
        return 0;
    }
    //写法5:形参是字符数组,再另外定义两个指针变量
    void copy_string(char from[],char to[]){
        char *p1,*p2;
        p1=from;
        p2=to;
        while ((*p2++ = *p1++) != '\0')*p2='\0';
    }
    
    

    4.其他写法

    
    void copy_string(char const *from, char *to){   //定义函数形参为字符指针变量
    //    写法1:
       for (; *from != '\0' ;from++,to++ ) { //检查当前元素是否是空,如果不是就执行复制的步骤
            *to = *from;
        }
        *to = '\0';
    
    写法2:更简洁
       while((*to = *from)!='\0'){
           from++;
           to++;
       }
        *to = '\0';
    
      写法3while (((*to++) =(*from++))!='\0'){
        *to='\0';
    }
    
    写法4while (((*to++) =(*from++))){   //当等于'\0'的时候就跳出循环,while()非0的时候就是真继续执行,否则跳出循环
            *to='\0';
        }
    }
    
    写法5:形参是字符数组,再另外定义两个指针变量
    void copy_string(char from[],char to[]){
        char *p1,*p2;
        p1=from;
        p2=to;
        while ((*p2++ = *p1++) != '\0')*p2='\0';
    }
    

    总结:用字符指针做函数参数时有以下几种对应关系:

    1. 实参:字符数组名
      形参:字符数组名或者字符指针变量

    2. 实参:字符指针变量
      形参:字符数组名或者字符指针变量

    展开全文
  • 不好意思,没仔细看,你的speedUp不是属性,是个方法,7楼的写法可以public class JavaApplication5 {public static void main(String[] args) {Scanner input = new Scanner(System.in);Tank tank1 = new Tank();...
  • linux下c++中如何在主函数中调用其他文件内的函数? 需要四个文件:a.cpp包含一个被调用的函数,myhead.h预定义这个函数,3.b.cpp主函数,4.Makefile文件。 1.a.cpp #include "myhead.h" #include using namespace...
  • 展开全部import java.util.Scanner;interface getGrade{public void finGrade();}class First implements getGrade{int a[];public First(){}public First(int grade[]){a=grade.clone();}public void finGrade(){...
  • 编写排序子函数,将10个数由小到大排序,并在主函数中调用它 编写排序子函数,将10个数由小到大排序,并在主函数中调用
  • /*  * 程序的版权和版本声明部分:...* 文件名称:编写函数判断某年某月某日这一年中是第几天,在主函数中调用函数.cpp  * 作 者:毛通  * 完成日期:2012 年 12月 03日  * 版 本 号:v1.0  */   #incl
  • 在主函数中调用其他文件内的函数

    千次阅读 2016-05-19 11:44:14
    再将头文件写在主函数所在的文件里。如下面所示: //文件a.c #include "a.h" int display(int a,int b){ cout return 0; } //文件a.h #include int display(int ,int ); //文件main.c #include "a.h" int m
  • 1. 在主函数中,如何进入调用函数【1】调用方法:先生成一个对象,用“对象.方法()”的方式调用。调用说明:java中的main方法是静态的,用于程序的入口,在静态方法中无法调用非静态方法,只能调用静态方法。想调用...
  • 我有一个python函数可能引发...这是有效的,除了当原始的调用者从异常显示调用堆栈时,它显示修饰器重新生成的行,而不是最初发生的行.示例代码:import sys,tracebackdef mydec(func):def dec():try:func()except...
  • 最后修改时间:2020-05-18 21:22:52 星期一健壮程序的要求工业级代码,必须要求开发的程序可以收到异常后,针对性的做出处理捕获异常语法简单语法try:# 尝试执行的代码passexcept:# 出现错误的处理pass错误...
  • 主函数在调用函数过程栈空间的使用情况 AHAOAHA 2018-01-15 20:22:47 3918 收藏 1 分类专栏: c语言 版权 #include<stdio.h> int Add(int a,int b) { int z=0; z=a+b; return z; } int main() { int a=...
  • typedef struct svg_render_engine { svg_status_t (* move_to)...在头文件中声明了这样一个结构体,我想在主函数中分别定义1.2.3这3个函数,应该怎么做。求大神指点。我一起用的OC,最近才需要用C来编写,是个新手。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,524
精华内容 1,409
关键字:

在主函数中调用函数