精华内容
下载资源
问答
  • 实参、形参、局部变量和全局变量

    千次阅读 2020-09-15 16:53:39
    目录实参和形参实参数据传递函数调用过程形参实参和形参的关系局部变量和全局变量局部变量局部变量...实参可以常量、变量或表达式, 无论实参何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些

    实参和形参

    实参

    实际参数简称“实参”。在调用有参函数时,函数名后面括号中的参数称为“实际参数”,实参可以是常量、变量或表达式。

    在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称“实参”)。

    实参可以是常量、变量或表达式, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

    数据传递

    在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。该值在函数调用期间有效,可以参加该函数中的运算。

    在调用函数过程中发生的实参与形参间的数据传递,常称为“虚实结合”。

    函数调用过程

    1. 函数的形参列于函数声明中,在函数定义的函数体内使用。在未出现函数调用时,形参不占内存中的存储单元;当函数调用时,形参(任何种类的)是一类将被填充的空白或是占位符。
    2. 将实参的值传递给形参。当函数被调用时,实参列在函数名后面的括号里。执行函数调用时,实参被传递给形参。
    3. 在执行函数期间,由于形参已经有值,可以利用其进行相关运算。
    4. 通过return语句将函数值带回到主调函数。
    5. 调用结束,形参单元被释放。实参单元仍保留并维持原值(值传递)。

    形参

    全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。

    形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。

    没有形参的函数在形参表的位置应该写void.main 函数也可以有形参和返回值,其形参也称为命令行参数,由操作系统在启动程序时初始化,其返回值传递给操作系统。

    实参和形参的关系

    1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
    2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
    3. 实参和形参在数量上,类型上、顺序上应严格一致,否则就会发生类型不匹配的错误。
    4. 在一般传值调用的机制中只能把实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参值发生改变,而实参中的值不会变化。而在引用调用的机制当中是将实参引用的地址传递给了形参,所以任何发生在形参上的改变实际上也发生在实参变量上。

    局部变量和全局变量

    局部变量

    局部变量,也称内部变量,是指在一个函数内部或复合语句内部定义的变量。

    局部变量的作用域是定义该变量的函数或定义该变量的复合语句。局部变量的生存期是从函数被调用的时刻算起到函数返回调用处的时刻结束。

    int f1(int a)
    {
    int b,c;
    ……
    }a,b,c作用域
    main()
    {
    int m,n;
    }

    在函数f1内定义了三个变量,a为形参,b,c为一般变量。在f1的范围内a,b,c有效,或者说a,b,c变量的作用域限于f1内。m,n作用域 m,n的作用域限于main函数内。

    局部变量的作用域说明:

    1. 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。
    2. 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
    3. 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。形参和实参的变量名都为n,是完全允许的。
    4. 在复合语句中也可定义变量,其作用域只在复合语句范围内。

    全局变量

    全局变量也称外部变量,它是在函数外部定义的变量。它不属于哪一个函数,而是属于一个源程序文件:其作用域是整个源程序。

    几乎程序中的所有函数都能使用全局变量,客观上全局变量就起到了在函数间传递数据的作用,甚至可以减少形参和实参的数量。当然在享用它的好处时,也要慎重,避免全局变量过多带来的降低函数通用性及存储空间的浪费。

    全局变量说明:

    1. 全局变量从程序运行起即占据内存,在程序整个运行过程中可随时访问,程序退出时释放内存。与之对应的局部变量在进入语句块时获得内存,仅能由语句块内的语句访问,退出语句块时释放内存,不再有效。
    2. 局部变量定义后不会自动初始化,除非程序员指定初值。全局变量在程序员不指定初值的情况下自动初始化为零。
    3. 在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用。
    int a,b;
    void f1()
    {
    ……
    }
    float x,y;
    int f2()
    {
    ……
    }
    main()
    {
    ……
    }

    从上例可以看出a、b、x、y 都是在函数外部定义的外部变量,都是全局变量。但x,y定义在函数f1之后,而在f1内又无对x,y的说明,所以它们在f1内无效。a,b定义在源程序最前面,因此在f1,f2及main内不加说明也可使用。

    展开全文
  • c++ 中函数形参没有变量名

    千次阅读 2019-11-03 16:14:00
    在c++中,有时候会看到这样的函数 int add(int,int);...这由于没有形参名的函数只用来声明,然而到定义的时候,必须有形参名称。类似这样: int add(int, int); int main() { cout << add(100, 100...

    在c++中,有时候会看到这样的函数

    int add(int,int);
    

    这一看,不知道是什么意思,为什么形参没有参数名?
    正常的情况应该是这样的

    int add(int a,int b);
    

    这是由于没有形参名的函数只用来声明,然而到定义的时候,一般情况下都有形参名称。类似这样:

    int add(int, int);//声明
    int main()
    {   
    	cout << add(100, 100) << endl;
    }
    int add(int a, int b) { //定义
    	return a + b;
    }
    

    然而,极端情况下,你一可以这样定义函数:

    int printNumber(int,int) { //定义
    	printf("number %d",100);
    }
    
    printNumber(10,10);//函数调用,必须传递参数,却用不到
    

    但是这样定义没有任何意义,因为你在调用时候还需要传递参数,然而函数体内部却得不到参数。
    还需要注意一点的是,在c++中定义带有参数的宏,是不与要定义形参的,原因是宏只是字符串的替换,它本身不是函数,就相当于模板匹配,用到了哪个宏,按照规律展开便是了。

    #define SUM(a,b) a+b //遇到SUM()这个符号,就替换成 宏的定义。没有形参名称,因为根本不必.任何类型的参数都可以替换成 两个类型相加的形式.
    
    展开全文
  • 这些对象变量名实际上指向实例的指针,过程结束之后,这个指针变量自动被释放了,但是你运行时分配的内存空间(或者对象实例化),也就是那些指针所指向的空间,则不由编译器负责销毁,那就只有你自己销毁了。...

    cout<<*a 是输出指针a指向地址所存放的数值
    cout<<a 是输出指针a的值,即地址

    编译器分配的局部栈变量是自动释放的,堆变量则必须自己释放。

    这些对象变量名实际上是指向实例的指针,过程结束之后,这个指针变量自动被释放了,但是你运行时分配的内存空间(或者对象实例化),也就是那些指针所指向的空间,则不由编译器负责销毁,那就只有你自己销毁了。

    “我想请问MystringList这个变量应该属于局部变量吧”这个myStringList当然是局部变量,过程结束后,这个myStringList当然被销毁了,但是他是个指针,销毁的只是一个4字节无符号整数而已,并不是这个整数所指向的对象的实例。所以实例不会被销毁。

    通常而言,Windows下面,程序在被执行的时候,操作系统会给你分配2GB的私有进程空间,程序结束之后,操作系统会回收那2GB的空间。所以你的程序在结束的时候,大可以不必管那些内存泄漏,Windows操作系统会帮你搞定,但是这样的行为是不好的。因为这样不会让你养成良好的编程习惯,而且有一些内容是会涉及到系统资源的,例如字体,你创建了一个逻辑字体对象但是你没有销毁,这样就会增加系统开销,操作系统是不会帮你销毁这类的。所以说,还是自己慢慢销毁所有创建的对象是个好习惯。

    所谓“两个指针相同”就是指的它们所指的地址相同,所以与指针类型无关,更不能说是“它们的地址值相同”,它们的地址值只是两个指针变量分配的内存位置。即两个指针相同,是指他们指向的地址相同,而不是他们的地址相同。

    一级指针做形参:首先一定要明白形参和你传递参数的那个实参是两个不同的变量,即使同名也还依然不同。指针传递的是一个变量或者一个值的地址,但是它本身还是采用值传递的方式。即你不能使它指向另外一块地址,但是你可以改变它指向的空间里存的值。

    二级指针做形参:二级指针也是传值,但是他指向的地址是个一维指针,所以可以改变二维指针指向的地址空间里的内容也就是要申请空间的一维指针,不能改变二维指针本身的值,即不能让他指向一个新的一维指针。所以二维指针传递的是一个一维指针。

    具体看下面这个程序以及输出:

    复制代码
    #include<stdio.h>
    #include <malloc.h>
    #include <string.h>
    
    void GetMemory1(char *p)
    {
        //该函数的形参为字符指针,在函数内部修改形参并不能真正改变传入形参的实参值。
     //因此在主函数中执行完下面两句之后
     //char *str1 = NULL; 
     //GetMemory1(str1);
     //str1仍然为NULL,因此会报内存错误,没有输出结果。
        p = (char *)malloc(100);
    
        //要记得使用指针变量时,每次分配空间后要判断是否分配成功。而且在主函数中使用之后记得释放内存,并置空
        if (p == NULL)
        {
            printf("error memory");
        }
    }
    /*但是上面的函数参数变为*char *&p就可以在主函数中正常输出了。
    指针做形参也是采用值传递的方式,也就是会把指针的值-地址传过去,所以可以改变这个地址里的内容,
    但是你不能改变指针的值,也就是指向的地址。但是引用就是变量的别名,所以可以改变指针的值,
    所以就可以在函数里申请空间*/
    
    char *GetMemory2(void)
    {
        char p[] = "hello world";
        return p;    //p[]数组为函数内部局部变量,在函数返回后,内存已经被释放了,
     //所以在主函数中调用该函数str2 = GetMemory2();输出的可能为乱码
    }
    
    void GetMemory3(char **p,int num)
    {
        *p = (char *)malloc(num);
    
        //要记得使用指针变量时,每次分配空间后要判断是否分配成功。而且在主函数中使用之后记得释放内存,并置空
        if (*p == NULL)
        {
            printf("error memory");
        }
    }
    void main()
    {
        int n=0;
        char *str1 = NULL;    
        char *str2 = NULL;
        char *str3 = NULL;
    
        //GetMemory1(str1);
     //strcpy(str1,"Hello world");
     //printf("%s\n",str1);
    
        str2 = GetMemory2();
        printf("%s\n",str2);//输出乱码
    
        GetMemory3(&str3,100);
        strcpy(str3,"hello world");
        printf("%s\n",str3);//输出hello world
    
        char *str4 = (char *)malloc(100);
        if (str4 == NULL)
        {
            printf("error memory");
        }
        else
        {
            strcpy(str4,"Hello");
            free(str4);
            str4 == NULL;//free后要置空,否则str可能变成“野指针”
        }
        if (str4 != NULL)
        {
            strcpy(str4,"world");
            printf("%s\n",str4);//输出world
        }
        scanf("%d",&n);
    }
    复制代码

    指针做局部变量:如果你申请了空间(用new等,赋值不算)又没有delete,那么这个空间在你程序运行结束之前不会释放,只要你知道这个空间的地址,就可以访问。这里的赋值不算是指,比如,你先定义一个数组,然后把数组名赋值指针。但是char *d = "ZET";这种形式相当于new了4个空间。

    下面是中兴通讯2012校招笔试题目,问输出什么?

    当时答错(狂汗),现在搞明白,在函数里写了注释:

    复制代码
    #include <stdio.h>
    
    //此函数中d也是个局部变量,函数执行完自动销毁,但是指针分配的空间不会被自动回收(即实例化的值),除非程序员delete掉。
    //所以这个可以正常输出。
    char *a()
    {
        char *d = "ZET";//这个初始化的一种形式,相当于分配了四个空间
        return d;
    }
    
    //但是第二个数组空间是系统维护的,函数执行完自动销毁 
    char *b()
    {
        char p[10] = {"3G平台"};
        return p;
    }
    
    
    //参数是值传递方式,改变形参的地址,传递的实参的地址确不会因此改变 
    void c(int n,char *pName)
    {
        char *a[4] = {"aaa","bbb","ccc","ddd"};
        pName = a[n];
    }
    
    void main()
    {
        int n=0;
        char *pName = "DB";
        printf("%s\n",a());//输出ZET
        printf("%s\n",b());//随机输出乱码
    
        c(2,pName);
        printf("%s\n",pName);    //输出DB,
    //因为char *pName = "DB";已经使得pName指向了DB,但c(2,pName);并不能改变pName指向的地址。他们指向的地址所存放的值是不同的,但他们的值是相同的,即地址相同?
     //形象点说就是:我有一个箱子给你用,你可以在里面装东西,但是你不能把我的箱子换成另外一个给我。
     //在这里指的是不能函数调用不能使pName变成函数中的二维数组a。
        
        scanf("%d",&n);
    }
    复制代码

    指针做形参,指针做局部变量,数组做形参,数组做局部变量之类的题目非常容易考到,而且容易迷糊,得不断学习...

    展开全文
  • 什么函数:程序中专门保存一段可重用的代码片段的程序结构,再起一个名字。 为什么要使用函数:代码重用 何时使用函数:只要一段代码...为什么要使用形参变量:有些函数执行时,必须传入必要的数据,才能正常的执行。

    什么是函数:程序中专门保存一段可重用的代码片段的程序结构,再起一个名字。
    为什么要使用函数:代码重用
    何时使用函数:只要一段代码可能被反复使用,都要先将这段代码保存在函数中。然后再反复调用这个函数
    创建函数:

    function 函数名(形参变量列表){
           函数体;
           return 返回值;
    }
    调用函数
    

    如何调用函数:var 变量=函数名(实参值列表);

    什么是形参变量:专门接收函数执行时必需的数据的变量
    为什么要使用形参变量:有些函数执行时,必须传入必要的数据,才能正常的执行。
    何时使用形参变量:只要一个函数执行时,必须外界传入某些数据才能正常执行时,都要定义形参变量

    什么是返回值:一个函数的执行结果,被返回到函数外部
    何时使用返回值:只要函数的调用者需要获得函数的执行结果时,都要定义函数的返回值。

    展开全文
  • 1.本应匿名的函数如果设置了函数如AAA,在外面无法调用AAA(),但是函数里面可以使用的 2.而且类似于创建常量一样,这个名字存储的值不能再被修改(非严格模式下不报错,但是不会有任何效果, 严格模式下直接报错...
  • 不能以数字开头标识符必须是由字母下划线开头的字母下划线数字组合 2.以下不正确的说法是:C 语言规定()。 实参可以是常量,变量或表达式 形参可以是常量,变量或表达式 实参可以为任何类型 ...
  • double cube(double x) { return x*x*x; } void main() { double m;...1.实参可以是常量,变量,表达式,函数等,但都必须是确定的值。 2.形参用于接收实参值的变量。 3.参数传递的过程:将实参的e值赋
  • 形参实参

    2018-02-25 13:28:26
    实参可以常量、变量、表达式、函数等, 无论实参何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。 形参(parameter):...
  • 实参与形参

    2020-06-21 12:09:38
    形参:是声明函数时写的,如果是多个形参,那么需要用,隔开。形参的值不是固定的,形参要与实参实际传入的数据一一相对应。 实参:在调用时,实际传入函数中的值,传入后,在函数中使用形参中...形式参数只能是变量
  • 形参和实参

    2020-12-03 18:01:58
    无论实参何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。 形参 由于它不是实际存在变量,所以又称虚拟变量在定义函数...
  • C语言中函数传递(实参 形参

    千次阅读 2018-06-05 16:12:45
    形参:在被调函数形参表...实参可以是变量名、数组名、常数或表达式。在过程调用  传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型、参数个数及位置必须一一对应
  • lisp 的形参

    2012-09-05 10:48:45
    函数形参列表 关于函数名或文档字符串...当形参列表一个由变量名所组成的简单列表时,如同在verbose-sum里那样,这些形参被称为必要形参。当函数被调用时,必须为它的每一个必要形参都提供一个实参。每一个形参被...
  • 实参和形参

    2019-10-27 21:09:31
    实参可以常量、变量、表达式、函数等, 无论实参何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。 形参 全称为"形式...
  • 形参与实参

    2021-02-16 11:16:59
    实参可以常量、变量、表达式、函数等, 无论实参何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。 ...
  • 实参,形参

    2020-08-11 21:22:29
    实参可以常量、变量、表达式、函数等, 无论实参何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。 形参(parameter): ...
  • C语言调用函数时采用“值传递”方式,当用变量名作为函数参数时传递的是变量的值,当用数组名作为函数参数时,传递的是数组首个元素的地址,要求形参必须为指针变量。 在下面的函数中,a作为数组名,可以直接作为...
  • 实参&形参

    2019-01-02 12:03:00
    实际参数可以是变量、常量、表达式以及函数 实际参数必须得有确定的值(赋值、输入等),在函数调用时,把这些值传递给形式参数 2.形参 parameter 形式参数,是在函数定义中的参数。是定义函数和函数体使用的...
  • 实参和形参的区别

    2020-08-16 13:58:09
    主体不同 1.实参:在调用有参函数时,...2.形参:定义函数和函数体的时候使用的参数,目的用来接收调用该 函数时传入的参数。 public static void test(int num) { int num1 = 0; System. out . println(num1) ; 形参 p
  • 可变个数形参

    2020-08-12 16:57:10
    可变个数形参的格式:数据类型…变量名 当调用可变个数形参的方法时,传入的参数个数可以:0个,1个,2个。。。 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载 可变个数形参的方法与本类中...
  • 形参和实参的区别

    2020-03-22 14:14:10
    1、实参:可以常量、变量或表达式, 无论实参何种类型的量,在进行函数调用时,都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。 2、形参:定义函数和函数体的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 654
精华内容 261
关键字:

形参必须是变量名