精华内容
下载资源
问答
  • c++函数局部变量调用

    2018-01-03 19:36:07
    使用两种方式访问函数局部变量值: (1)函数返回值 int fun () { int m=2; return m; //作为返回,传出m的值 } void main() { int x; x= fun(); //x可以使用局部变量的值 } (2)指针引用 void...

    在百度知道看到的,在此记录一下。

    使用两种方式访问函数局部变量值:


    (1)函数返回值

    int fun ()
    { 
        int m=2;
        return m; //作为返回,传出m的值
    }
     
    void main()
    {
        int x;
        x= fun(); //x可以使用局部变量的值 
    }


    (2)指针引用

    void fun (int *p)
    {
        int m=2;
        *p=m;  //在p指向的地址中保存m的值
    }
     
    void main()
    {
        int x;
        fun(&x); //指针作为参数传递给函数,函数执行完之后x=m
    }



    展开全文
  • ![图片说明](https://img-ask.csdn.net/upload/201904/16/1555402232_102697.png) 为什么图中那行调用方式会报错呢? 我想将字符串mes提取出来作为一个public String 该怎么做呢?
  • UINT8 acc_tab_sta = acc->acc_tab_sta; static void hmi_adas_root_callback_on_status(ndm_node_t *self, ndm_evt_t *in_status) { UINT8 acc_tab_sta = 0; switch (NodeMsgGetEvent(in_status)) ...
  • 返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗?  返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题。 返回局部...
    返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗? 
    返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题。
    返回局部变量的引用也是绝对不可以的。 引用只是变量的一个别名,变量本体都不存在了,引用当然也没有任何意义。 还有,如果是堆空间,可以返回,即在函数中用new申请的空间,是可以返回的。但是一般的情况下,好的风格是: 尽量在同一个作用域内成对使用new   和delete,(也即不要返回堆空间),因为如果不是这样,会是你的函数的接口变的不够灵活, 试想每个调用你的函数的人还需要记得去delete掉你在函数中new的堆空间, 否则就会造成内存泄露。
    返回啥其实都是值拷贝! 指针就是指针值拷贝,   不会拷贝被指向的内容。

    永远不要从函数中返回局部自动变量的地址。如果你真的需要这样操作。你可以在函数的参数表中传入一个指针变量。然后将需要写入的数据写入到该指针变量指向的地址。由于该指针指向的变量,作用域在函数体 之外。因此不会在函数结束结束时被回收。

    在C语言中为什么说绝不能返回函数内局部变量的地址?
    在程序中,只在特定的过程或函数中可以访问的变量,是相对与全局变量而言的。
    全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。
    局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
    
    
    局部变量的特点是:随函数调用时创建 随函数结束时析构(销毁)。
    设想,如果返回了一个局部变量的指针,而恰好局部变量偏偏又在函数结束后销毁,但指针并没有被销毁,而是被返回,那也就是说,指针指向的正是一个被销毁了的对象。
    一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。

        下面以函数返回局部变量的指针举几个典型的例子来说明:

    1:

    #include <stdio.h>    
    char *returnStr()   
    {   
        char *p="hello world!";   
        return p;   
    }   
    int main()   
    {   
        char *str;   
        str=returnStr();   
        printf("%s\n", str);   
        return 0;   
    }  



    这个没有任何问题,因为"hello world!"是一个字符串常量,存放在只读数据段,把该字符串常量存放的只读数据段的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。

    2:

    #include <stdio.h>   
    char *returnStr()   
    {   
        char p[]="hello world!";   
        return p;   
    }   
    int main()   
    {   
        char *str;   
        str=returnStr();   
        printf("%s\n", str);   
        return 0;   
    } 


    "hello world!"是局部变量存放在栈中。当returnStr函数退出时,栈要清空,局部变量的内存也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以有可能打印出来的是乱码。 

    3:

    int func()  
    {  
          int a;  
          ....  
          return a;    //允许  
    }                     
      
    int * func()  
    {  
          int a;  
          ....  
          return &a;    //无意义,不应该这样做  
    }   


    局部变量也分局部自动变量和局部静态变量,由于a返回的是值,因此返回一个局部变量是可以的,无论自动还是静态,

    因为这时候返回的是这个局部变量的值,但不应该返回指向局部自动变量的指针,因为函数调用结束后该局部自动变量

    被抛弃,这个指针指向一个不再存在的对象,是无意义的。但可以返回指向局部静态变量的指针,因为静态变量的生存

    期从定义起到程序结束。

    4:如果函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型。如下:
    #include <stdio.h>   
    char *returnStr()   
    {   
        static char p[]="hello world!";   
        return p;   
    }   
    int main()   
    {   
        char *str;   
         str=returnStr();   
        printf("%s\n", str);   
      
        return 0;   
    }  


    5: 数组是不能作为函数的返回值的,原因是编译器把数组名认为是局部变量(数组)的地址。返回一个数组一般用返回指向这个数组的指针代替,而且这个指针不能指向一个自动数组,因为函数结束后自动数组被抛弃,但可以返回一个指向静态局部数组的指针,因为静态存储期是从对象定义到程序结束的。如下:
    int* func( void )  
    {  
        static int a[10];  
        ........  
        return a;  
    }   

    6:返回指向堆内存的指针是可以的

    char *GetMemory3(int num)  
    {  
    char *p = (char *)malloc(sizeof(char) * num);  
    return p;  
    }  
    void Test3(void)  
    {  
    char *str = NULL;  
    str = GetMemory3(100);  
    strcpy(str, "hello");  
    cout<< str << endl;  
    free(str);  
    } 

    程序在运行的时候用 malloc 申请任意多少的内存,程序员自己负责在何时用 free释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。 

    c++中子函数的局部变量在函数结束后是否会销毁变量的内容?


    展开全文
  • 静态局部变量和动态局部变量区别

    千次阅读 2020-05-13 10:03:05
    2.静态局部变量在编译时赋初值,程序运次时已经有初值,以后每次调用函数不再重新赋初值而只是保留上次函数调用结束时的值。 3.静态局部变量编译时赋初值默认是0 而自动变量,如果不赋初值则它的值是不确定的值。 4....

    静态局部变量和动态局部变量区别:

    1.静态局部变量属于静态存储类别,在静态存储区分配存储单元,在整个运行期间都不释放。
    而自动变量(动态局部变量)属于动态存储类别,占动态存储空间,函数调用后释放
    2.静态局部变量在编译时赋初值,程序运次时已经有初值,以后每次调用函数不再重新赋初值而只是保留上次函数调用结束时的值。
    3.静态局部变量编译时赋初值默认是0
    而自动变量,如果不赋初值则它的值是不确定的值。
    4.静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。

    如果用static修饰全局变量,那么该全局变量不能被其他文件引用。
    不能再被extern(extern和static都是修饰符)
    如果用static修饰函数,那么该函数本文件内可以引用而其他文件不能引用。

    展开全文
  • string类型在代码中属于局部变量,那么局部变量必须赋值,哪怕是null,否则编译通不过的, * 会提示说此变量未初始化,如果是类的成员变量,则可以不赋值,它会有默认值的。 java为了规避一些运行期间的空指针错误,...

    一道笔试题

    22. 下面代码的运行结果为:()

    复制代码
    复制代码
    import java.io.*;
    import java.util.*;
    
    public class foo{
    
        public static void main (String[] args){
    
            String s;
    
            System.out.println("s=" + s);
    
        }
    
    }
    复制代码
    复制代码

    A 代码得到编译,并输出“s=”

    B 代码得到编译,并输出“s=null”

    C 由于String s没有初始化,代码不能编译通过

    D 代码得到编译,但捕获到 NullPointException异常

    答案:C

    解析:开始以为会输出null什么的,运行后才发现Java中所有定义的基本类型或对象都必须初始化才能输出值。

    以上解析错了.

    原因是,方法中的局部变量一定要手动初始化,不然编译会报错.

    Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
        The local variable s may not have been initialized

     

     二. 那么也就是说,全局变量不需要手动初始化,JVM会自动初始化为null或0.

    复制代码
    public class Test00001{
         static String s;
         String x=8;
         String y;
         /*string类型在代码中属于局部变量,那么局部变量必须赋值,哪怕是null,否则编译通不过的,
          * 会提示说此变量未初始化,如果是类的成员变量,则可以不赋值,它会有默认值的。
    java为了规避一些运行期间的空指针错误,都会强调局部变量必须赋值,
    否则编译器会立即报错,提示用户修改。 */
        public static void main (String[] args){
    
            Test00001 t = new Test00001();
            System.out.println(t.s);//输出null
            System.out.println(t.x);//输出null
            System.out.println(x);//报错,没有初始化,或者不是类静态变量
            //方法中不能调用类的非静态变量属性??哪怕已经初始化.
            System.out.println("s=" + s);//输出null
    
        }
    
    }
    复制代码

    只要能够调用,全局变量(也就是类变量)都有自动的初始化值.    不会产生编译器报错

     

    三.但是又产生一个新问题,很重要,

     

    类的静态方法(函数)中为什么不能调用非静态成员(属性)?

     

    复制代码
    程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。
    类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
    在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错:class CA{private:int a; //非静态成员,创建类的实例时分配内存,类的不同实例对应不同的内存区域
    复制代码

    yes,上诉就是真正的原因.

     

    所以main方法也是static 类的静态方法,所以他不能直接调用类的非静态属性和方法.   此时,虽然不需要初始化类属性变量,但是因为不能直接调用非静态变量,依然报错.

    复制代码
    public class Test04 {
        String s;
        public static void main(String[] args) {
                System.out.println(s);//报错
        }
    
    }
    复制代码
    Unresolved compilation problem: 
        Cannot make a static reference to the non-static field s

     注意这和一开始的局部变量一定要初始化报错,本质不同!

     

     

    四.那么类中非静态方法可以直接调用非静态变量吗?,可以!

    复制代码
    public class Test02 {
        String s;
        public static void main(String[] args) {
            Test02 t = new Test02();
            t.test();  //输出null
        }
    public void test(){
        System.out.println(s);
    }
    }
    复制代码

    原因是在 new 实例化一个类的 对象时,会加载这个类的所有属性和方法,将其放到内存中来.

    但是,以下又会报错:

    复制代码
    public class Test02 {
        String s;
        public static void main(String[] args) {
            Test02 t = new Test02();
            t.test();
            System.out.println(s);//报错
        }
    public void test(){
        System.out.println(s);
    }
    }
    复制代码
     Unresolved compilation problem: 
        Cannot make a static reference to the non-static field s

    还是会报 静态方法不能调用非静态变量.

    虽然,在静态方法中初始化这个类的对象.

    展开全文
  • Python 调用局部变量 局部变全局变量

    千次阅读 2019-06-20 10:14:48
    def Psum (): list3 = [[0.8, 0.7, 0.9, 1.0, 1.1], [1.6, 1.7, 1.8, 1.9, 2.0], [2.4, 2.7, 2.3, 2.9, ], [3.8, 3.7, 3.3, 3.4, ]] p1 = [] for i in range(4): list2 = rand...
  • C++中定义的函数,必须有输入参数(或者说是,形参列表)。...在main函数中,当局部变量和全局变量同时存在的时候,优先引用局部变量,而不去引用全局变量。 "::"这个符号,可以直接来操作全局变量的。
  • 而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储空间,函数调用结束后立即释放。 2、对静态局部变量是在编译时赋初值的,即只赋值一次,在程序运行时它已有初值。以后每次调用...
  • 形参、局部变量和静态局部变量的差别  从本质上说,三者均属于局部作用域中的变量,其中局部变量又可以分为普通(非静态)局部变量和静态局部变量。它们的差别: 作用域:形参的作用域为整个函数体;而普通(非...
  • 首先我们来研究一下变量生命周期的问题,局部变量的生命周期是当该方法被调用时在栈中被创建,当方法调用结束时(执行完毕),退栈,这些局部变量就会死亡。但是内部类对象是创建在堆中的,其生命周期跟其它类一样,...
  •   基本概念: 作用域:起作用的区域,也就是可以工作的范围。...C语言中局部变量就分配在栈中。   局部变量  普通的局部变量定义的时候直接定义或者在前面加上auto void func1(void){&nbs...
  • 变量可以分为:全局变量、静态全局变量、静态局部变量局部变量。 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态 存储区域,局部变量存放在内存的栈区。 按作用域分,全局变量在整个...
  • 1.局部变量定义:在成员方法中定义的变量称为局部变量;(方法中的形参也可以作为局部变量)例:public void method1() { //n,i均为局部变量 int n; for(int i=0;i&lt;5;i++) { System.out.println("*...
  • Lua全局变量与局部变量

    千次阅读 2019-04-22 16:55:52
    在lua中,局部变量(变量名前加 local)与全局变量类似于C语言中的概念: print(a) --打印变量nil a=111 --全局变量(整个lua文件中都可以使用,向下的范围) do local a=0--局部变量在语句块的结束 a=1 ...
  • 如果ruby中一个局部变量名和私有方法名同名的话,默认只能
  • 成员变量和局部变量同名 在同一个作用域内不允许定义同名的多个变量。   在一个方法内,可以定义和成员变量同名的局部变量或参数,此时成员变量被屏蔽。此时如果想要访问成员变量,可以通过 this 关键字来...
  • 关于java成员变量和局部变量

    万次阅读 多人点赞 2018-09-14 10:46:45
    1、成员变量和局部变量简述 在Java语言里,根据定义变量位置的不同,可以将变量分成两大类:成员变量(存在于堆内存中,和类一起创建)和局部变量(存在于栈内存中,当方法执行完成,让出内存,让其他方法来使用内存)...
  • 1、局部变量能否和全局变量重名?  答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: "  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器...
  • OOP中局部变量与成员变量

    千次阅读 2019-04-19 21:02:35
    局部变量 局部变量的定义 局部变量是定义在方法中或定义在循环体中的变量。 局部变量创建的位置 局部变量创建于栈内存中 局部变量的初始化 ...局部变量: 随着方法的调用而创建,随着方法的执行结束而销毁。...
  • 大家都知道,java的规范中是不允许局部匿名内部类来调用非final的类型局部变量的,这点并没什么好说的毕竟是规范嘛。我们要无条件的遵守。 问题是官方的文档中还有一个词与之先关,“与final”相同效果的变量。之前...
  • (1) 形参的作用域为整个函数体,而普通(非静态)局部变量和静态局部变量的作用域为:从定义处到包含该变量定义的块的结束处。 (2) 形参由调用函数时所传递的实参初始化;而普通(非静态)局部变量和...
  • 静态局部变量

    2014-10-16 10:33:09
    函数结束时,静态局部变量不会消失,每次该函数调用 时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其 初始...
  • js 全局调用局部变量

    千次阅读 2018-01-12 14:21:39
    作者:LoveEmperor-王子様 function fc1(){ num=66666; function fc2(){ alert(num); } return fc2; } var result=fc1(); console.log(num); // 66666 result();
  • 新手小白学 JAVA 方法 局部变量 成员变量

    万次阅读 多人点赞 2021-04-01 23:59:30
    2.2 局部变量 位置:定义在方法里或者局部代码块中 注意:必须手动初始化来分配内存.如:int i = 5;或者int i; i = 5; 作用域:也就是方法里或者局部代码块中,方法运行完内存就释放了 2.3 成员变量 位置:定义在类里方法...
  • 按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1、全局变量在整个工程文件内都有效; 2、静态全局变量只在定义它的文件内有效; 3、...
  • Java 匿名内部类调用局部变量

    千次阅读 2018-04-16 17:30:02
    Java 8 之前,匿名内部类中使用 局部变量,需要强制使用 final 修饰 Java 8 开始匿名内部类使用的外部变量不再被强制用final修饰。 外部变量要么是final的;要么自初始化后值不会被改变 这两种都是可以在匿名...
  • #include #include int *n() { ...在这个程序中,函数n返回的时候是不是就已经释放了局部变量a?那么我这时候的p是不是就是一个野指针。为什么我在输出语句中还是能输出5。这种做法是不是不安全的。
  • python3 全局变量和局部变量

    万次阅读 2018-08-10 14:37:56
    3.局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁 全局变量: 1.定义在函数外部,模块内部的变量称为全局变量 2.全局变量,所有函数都可以直接访问(但函数内部不能直接修改全局变量的绑定关系)   ...
  • 概念首先得明白局部变量,静态局部变量,全局变量,静态全局变量这几个概念,以下面程序举例://main.cpp int a = 0; //全局变量 static int b=0;//静态全局变量 main() { int c; //局部变量 static int d;//静态...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 535,381
精华内容 214,152
关键字:

局部变量怎么调用