精华内容
下载资源
问答
  • 隔江千里错 如果同一个源文件中,只有一个主函数,外部变量与局部变量同名...其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。例如:intf1(int a) /*函数f1*/{int b,c;……}a,b,c有效int f2(int x) /*函...

    b4f35c4fbb5598e9e45df1cba73edf1b.png

    隔江千里

    错 如果同一个源文件中,只有一个主函数,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。所以是错的8.1.1 局部变量局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。例如:int f1(int a) /*函数f1*/{int b,c;……}a,b,c有效int f2(int x) /*函数f2*/{int y,z;……}x,y,z有效main(){int m,n;……}m,n有效在函数f1内定义了三个变量,a为形参,b,c为一般变量。在 f1的范围内a,b,c有效,或者说a,b,c变量的作用域限于f1内。同理,x,y,z的作用域限于f2内。m,n的作用域限于main函数内。关于局部变量的作用域还要说明以下几点:1) 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。2) 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。3) 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。如在前例中,形参和实参的变量名都为n,是完全允许的。4) 在复合语句中也可定义变量,其作用域只在复合语句范围内。例如:main(){int s,a;……{int b;s=a+b;…… /*b作用域*/}…… /*s,a作用域*/}【例8.12】main(){int i=2,j=3,k;k=i+j;{int k=8;printf("%d\n",k);}printf("%d\n",k);}本程序在main中定义了i,j,k三个变量,其中k未赋初值。而在复合语句内又定义了一个变量k,并赋初值为8。应该注意这两个k不是同一个变量。在复合语句外由main定义的k起作用,而在复合语句内则由在复合语句内定义的k起作用。因此程序第4行的k为main所定义,其值应为5。第7行输出k值,该行在复合语句内,由复合语句内定义的k起作用,其初值为8,故输出值为8,第9行输出i,k值。i是在整个程序中有效的,第7行对i赋值为3,故以输出也为3。而第9行已在复合语句之外,输出的k应为main所定义的k,此k值由第4 行已获得为5,故输出也为5。8.1.2 全局变量全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。例如:int a,b; /*外部变量*/void f1() /*函数f1*/{……}float x,y; /*外部变量*/int fz() /*函数fz*/{……}main() /*主函数*/{……}从上例可以看出a、b、x、y 都是在函数外部定义的外部变量,都是全局变量。但x,y 定义在函数f1之后,而在f1内又无对x,y的说明,所以它们在f1内无效。a,b定义在源程序最前面,因此在f1,f2及main内不加说明也可使用。【例8.13】输入正方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。int s1,s2,s3;int vs( int a,int b,int c){int v;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;return v;}main(){int v,l,w,h;printf("\ninput length,width and height\n");scanf("%d%d%d",&l,&w,&h);v=vs(l,w,h);printf("\nv=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);}【例8.14】外部变量与局部变量同名。int a=3,b=5; /*a,b为外部变量*/max(int a,int b) /*a,b为外部变量*/{int c;c=a>b?a:b;return(c);}main(){int a=8;printf("%d\n",max(a,b));}如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。

    展开全文
  • 变量、过滤器和常量1.1 函数作用域函数作用域是function关键字创建的作用域functionindex(){$date['uid']=1;return$date['uid'];}unset($date['uid']);//未定义报错echo index();//1unset($date['uid']);//未定义...

    变量、过滤器和常量

    1.1 函数作用域

    函数作用域是function关键字创建的作用域

    functionindex()

    {

    $date['uid']=1;

    return$date['uid'];

    }

    unset($date['uid']);//未定义报错

    echo index();//1

    unset($date['uid']);//未定义报错

    functionadd()

    {

    $date['pid']=1;

    unset($date['pid']);

    unset($date['uid']);

    return$date['pid'];//未定义报错

    }

    echo add();//无输出

    echo index();//1

    小结:

    date[‘uid’]只能在index函数中起作用 在index函数外访问会出现未定义报错

    1.2 全局作用域

    函数之外的变量生效范围

    1.3 变量类型私有变量

    全局变量

    超全局变量

    1.3.1 私有变量

    函数中定义的变量

    1.3.2 全局变量

    函数之外定义的变量

    1.3.3 超全局变量

    超全局变量,也叫超全局数组,随系统加载,因此在所有脚本中均有定义,全局和函数中都可以访问

    序号

    变量名

    描述

    1

    $GLOBALS

    引用全局作用域中可用的变量

    2

    $_SERVER

    服务器执行环境信息

    3

    $_GET

    HTTP GET 请求:通过 URL 参数传递给当前脚本的变量的数组

    4

    $_POST

    HTTP POST 请求: 将变量以关联数组形式传入当前脚本

    5

    $_FILES

    HTTP 文件上传变量,保存着上传文件的全部信息

    6

    $_COOKIE

    通过 HTTP Cookies 方式传递给当前脚本的变量的数组

    7

    $_SESSION

    当前脚本可用 SESSION 变量的数组

    8

    $_REQUEST

    默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组

    9

    $_ENV

    通过环境方式传递给当前脚本的变量的数组

    1.3.4 global 和 $GLOBALS 的使用global$name="xu.bug";//Parse error: syntax error, unexpected '=', expecting ',' or ';'

    functionindex()

    {

    //试图引用函数外面的变量

    echo"myname is ".$name."
    ";

    }

    index();

    即上述代码有错误。原因是 global的用法不对,不能在用global声明变量的同时给变量赋值。

    global$name;

    $name="xu.bug";

    functionindex()

    {

    //试图引用函数外面的变量

    echo"myname is ".$name."
    ";//Notice:Undefined variable: name in

    mynameis

    }

    index();

    即上述代码有错误。原因是 global的用法不对,不能在用global声明变量的同时给变量赋值。

    综合以上得出结论:

    global的正确用法是:”在一个函数中引入外部的一个变量,如果该变量没有通过参数传递进来,那么就通过global引入进来。” 也就是说,当一个函数引用一个外部变量时,可以在函数内通过global来声明该变量,这样该变量就可以在函数中使用了(相当于当作参数传递进来)。

    $name="xs.bug";

    functionindex()

    {

    global$name;

    //试图引用函数外面的变量

    echo"myname is ".$name."
    ";

    }

    index();//myname is xs.bug

    即上述代码说明global是起传递参数的作用,而并非使变量的作用域为全局 。

    $name="xs.bug";

    functionindex()

    {

    $gname=$GLOBALS['name'];

    //试图引用函数外面的变量

    echo"myname is ".$gname."
    ";

    }

    index();//myname is xs.bug

    1.3.5 static 静态变量

    在函数执行完后,变量值仍然保存 不用静态变量 调用函数后会马上进行销毁

    functiontestStatic(){

    static$val=1;

    echo $val;

    $val++;

    }

    testStatic();//output 1

    testStatic();//output 2

    testStatic();//output 3

    1.4 filter过滤器

    相关函数

    filter_list() 获去过滤器名称

    filter_id() 获去过滤器id

    filter_input(); 单个传参值验证

    filter_input_array(); 数组传参验证

    foreach(filter_list()as$filter){

    echo $filter.'------'.filter_id($filter).'
    ';

    }

    //可遍历出所有名称和id

    简单验证

    $args=[

    'username'=>513,

    'email'=>274,

    'age'=>['filter'=>257,'flags'=>FILTER_REQUIRE_SCALAR,'options'=>['min_range'=>18,'max_range'=>80]],

    'blog'=>273,

    ];

    var_dump(filter_input_array(INPUT_GET,$args));.

    1.5 常量

    在整个运行过程中,固定不变的值

    1.5.1 定义常量

    1 define(常量名,值,[是否区别大小写]) true表示不区分大小写,默认是false,常量名前没有$符,常量名推荐使用大写

    define('NAME','tom');//定义常量

    define('PI',3.14,true);//定义常量,不区分大小写

    echo NAME,'
    ',Pi;

    //true表示不区分大小写,默认是区分大小写的。

    2、定义常量可以用特殊字符,但是在调用的时候必须用constant关键字调用

    define('%-%','tom');

    echo constant('%-%');//通过constant获取特殊字符作为常量名的常量

    3、判断常量是否定义,通过defined()判断常量是否已经定义

    if(!defined('NAME')){

    define('NAME','berry');

    }

    echo NAME;//berry

    4、还可以使用const关键字定义常量

    constNAME='tom';

    echo NAME;//tom

    5、define()和const 区别

    define()可以函数和流程控制中定义 而const不行

    const 可以用在类中 而 define()不行

    1.5.2魔术常量魔术常量属于”预定义常量”, 比较特殊所以单独列出

    所谓”魔术”, 是指常量的值, 会随它们在代码中的位置改变而改变

    魔术常量不区分大小写, 但是推荐全部大写

    序号

    魔术常量

    描述

    1

    __LINE__

    文件中的当前行号

    2

    __FILE__

    文件的完整路径和文件名

    3

    __DIR__

    文件所在目录

    4

    __FUNCTION__

    当前的函数名称

    5

    __CLASS__

    当前类名称

    6

    __TRAIT__

    当前Trait名称

    7

    __METHOD__

    当前类方法名称

    8

    __NAMESPACE__

    当前命名空间名称

    展开全文
  • 文章目录C变量作用域、链接和存储期的含义一、基本术语  1.1 什么是对象(object)  1.2 什么是标识符(identifier)二、作用域、链接和存储期三者关系三、作用域详解  3.1 块作用域&...

    本人就职于国际知名终端厂商,负责modem芯片研发。
    在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。


    在这里插入图片描述

    C变量作用域、链接和存储期的含义

    错误的定义C语言变量的作用域、链接和存储区在某种程度上会直接影响程序的设计,我们通过这篇博文介绍如何正确合理的定义一个C变量。

    从定义一个C变量开始成为一个C高手


    一、基本术语

      1.1 什么是对象(object)

           C语言中的对象含义与C++的完全不同,C语言中的对象指的是存储数据的一块内存。对象可以存储一个或多个值,一个对象可能并未存储实际的值,但是在存储适当的值时一定具有相应的大小。对象可以存在于程序的执行期,也可以仅存在于它所在函数的执行期。

      1.2 什么是标识符(identifier)

           标识符就是一个名称,通过这个标识符可以修改对象的内容。标识符可以在源代码的多文件中共享、可用于特定文件的任意函数中、可仅限于特定函数中使用,甚至只在函数中的某部分使用。

    举个例子,我们定义一个int型变量point:

    int point;
    

    对象与标识符的关系如下图
    在这里插入图片描述

    二、作用域、链接和存储期三者关系

           存储期用来描述对象,所谓的存储期就是指对象在内存中可以保留多长时间

           标识符用于访问对象,使用作用域(scope)和链接(linkage)描述标识符,标识符的作用域和链接表明了程序的哪些部分可以使用它


    三、作用域详解

    作用域描述程序中可访问标识符的区域
    一个C变量的作用域可以是块作用域函数作用域函数原型作用域文件作用域,下面我们详细讲解每个作用域的含义。

      3.1 块作用域

           块是用一对花括号括起来的代码区域,定义在块中的变量具有块作用域块作用域变量的可见范围是从定义处到包含该定义的块的末尾

           另外,虽然函数的形式参数声明在函数的左花括号之前,但它们也具有块作用域,属于函数体这个块。

    int Star_CongShanRuoShui(int user_id)
    {
    	int res = 0;
    	......
    	return 
    }
    

    👆上面code中“user_id”和“res”都具有块作用域

    int Star_CongShanRuoShui(int user_id[] , int n)
    {
    	int res = 0;
    	for(int i=0;i<n;++i)
    	{
    		......
    		int q=0;   //q的作用域开始
    		
    		......
    	}              //q的作用域结束
    	......
    	return 
    }
    

    👆上面code中变量“q”的作用域仅限于for循环的循环体中

        3.1.1 块概念的扩展

           C99将块概念扩展到包括for循环、while循环、do while循环和if语句所控制的代码,即使这些代码没有使用花括号括起来,也算是块的一部分,下面的code👇

    #include<stdio.h>
    
    int main()
    {
    	int Star_CSRS = 8;
    	printf("[main] value of Star_CSRS is %d | address of Star_CSRS:%p\n",
    			Star_CSRS ,&Star_CSRS);
    	
    	for(int Star_CSRS=0;Star_CSRS<4;++Star_CSRS)
    	{
    		printf("[for index] value of Star_CSRS is %d | address of Star_CSRS:%p\n",
    			Star_CSRS ,&Star_CSRS);
    			
    		int Star_CSRS = 6;
    		printf("[for] value of Star_CSRS is %d | address of Star_CSRS:%p\n",
    			Star_CSRS ,&Star_CSRS);
    		
    		++Star_CSRS;
    	}
    	
    	printf("[main] value of Star_CSRS is %d | address of Star_CSRS:%p\n",
    			Star_CSRS ,&Star_CSRS);
    
    	return 0;
    } 
    

    输出如下:
    在这里插入图片描述

    • 在main中定义了变量Star_CSRS,在for循环头中定义的变量Star_CSRS 隐藏了main中的Star_CSRS
    • for的循环体中的Star_CSRS又隐藏了for循环头中的Star_CSRS
      在这里插入图片描述

      3.2 函数作用域

           函数作用域的概念仅限于goto语句的标签。这意味着即使一个标签首次出现在函数的内层块中,它的作用域也延伸至整个函数中(详细可以参考我的这篇博文)。


      3.3 函数原型作用域

           用于函数原型的形参变量名,如下所示:

    int Star_CongShanRuoShui(int user_id);
    

           函数原型作用域的范围是从形参定义处到原型声明结束。对于函数原型中的形参编译器只关心形参类型,不关系具体的形参名即使有形参名也不必与函数定义中的形参名相匹配

           只有在变长数组中,形参名才有意义,如下例(变长数组详细参考我的这篇博文):

    int Star_CongShanRuoShui(int n ,int user_id[n]);
    

      3.4 文件作用域

           定义在所有函数外的变量具有文件作用域。具有文件作用域的变量,从它的定义处到该定义所在文件的末尾均可见(文件作用域变量也称为全局变量)。

    翻译单元与文件

    • 编译器将一个源代码文件和所有的头文件都看成一个包含信息的单独文件,这个文件被称为翻译单元
    • 一个翻译单元包括一个源代码文件和它所include的文件
    • 如果一个程序有多个源代码文件,那么这个程序也将有多个翻译单元
    • 一个文件作用域变量的可见范围其实是整个翻译单元(一个源代码文件+头文件)

    四、链接详解

    C变量有3中链接属性:无链接、内部链接、外部链接

      4.1 无链接

           具有块作用域、函数作用域和函数原型作用域的变量都是无链接变量。这意味着这些变量属于定义它们的块、函数或原型私有

      4.2 内部链接

           内部链接变量只能在一个翻译单元中使用,该变量使用存储类别说明符static修饰,如下:

    int Star_CSDN=1;                     //文件作用域,外部链接
    static int Star_CongShanRuoShui=2;   //文件作用域,内部链接
    
    int main()
    {
    	......
    	return 0
    }
    

      4.3 外部链接

           外部链接变量可以在多个文件中使用。外部链接变量的声明分为“定义性声明”和“引用性声明”。C编译器要求一个变量只能定义一次,重复定义编译器会报错。如果需要在其它文件中使用外部链接变量需要使用extern引用性声明这个变量,如下面cdoe:

    //file a.c
    
    //在文件a.c中定义一个外部链接变量Star_CongShanRuoShui
    int Star_CongShanRuoShui = 2;
    
    ......
    
    //file b.c
    
    //文件b.c中使用extern引用性声明变量Star_CongShanRuoShui
    extern int Star_CongShanRuoShui;
    
    ......
    

    五、存储期详解

    C对象有4种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期。

      5.1 静态存储期

           具有静态存储期的对象,它在程序的执行期间一直存在文件作用域变量具有静态存储期

    注意,对于文件作用域变量,关键字static表明了其链接属性,而非存储期。以static声明的文件作用域变量具有内部链接属性,但是无论是内部链接还是外部链接,所有文件作用域变量都具有静态存储期

      5.2 线程存储期

           线程存储期用于并发程序设计,程序执行可被分为多个线程。具有线程存储期的对象,从被声明时到线程结束一直存在。以关键字__Thread_local声明一个对象时,每个线程都获得这个变量的私有备份

      5.3 自动存储期

           块作用域的变量通常都具有自动存储期。当程序进入定义这些变量的块时,为这些变量分配内存;当退出这个块时,释放刚才为这些变量分配的内存。通过这种做法可以实现内存的重复利用。

    变长数组稍有例外,它的存储期从声明处到块的末尾,而不是从块的开始处到块的末尾

           我们上面说块作用域的变量通常都具有自动存储期,但是也能具有静态存储期。为了创建这样的变量,要把变量声明在块中,且在声明前加上关键字static,如下例:

    int Star_CongShanRuoShui(int user_id)
    {
    	static int isStar = 0;
    	......
    	return 
    }
    

           变量isStar存储在静态内存中,它从程序被载入到程序结束期间都存在。但是,它的作用域定义在Star_CongShanRuoShui()函数块中,只有在执行该函数时,程序才能使用isStar访问它所指定的对象(当然,也可以存储该变量的地址实现间接访问该对象)


      5.4 动态分配存储期

           程序运行时通过malloc()等内存分配函数分配的对象具有动态分配存储期,这样的对象需要使用free()函数进行销毁。

    动态内存分配和变长数组在功能上有些重合,但是还是有所不同:

    • 变长数组是自动存储类型
    • 用malloc函数创建的数组不必局限在一个函数中使用

    在这里插入图片描述

    展开全文
  • 码农公社 210.net.cn210= 102410月24日一个重要的节日--码农(程序员)节作用域任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:在函数或块内部...

    201610181557196870.jpg

    码农公社  210.net.cn  210= 1024  10月24日一个重要的节日--码农(程序员)节

    作用域

    任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:在函数或块内部的局部变量

    在所有函数外部的全局变量

    在形式参数的函数参数定义中

    局部变量

    在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。

    全局变量

    全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。

    全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。

    在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会使用局部变量值,全局变量不会被使用。

    形式参数

    函数的参数,形式参数,被当作该函数内的局部变量,如果与全局变量同名它们会优先使用。全局变量与局部变量在内存中的区别:全局变量保存在内存的全局存储区中,占用静态的存储单元;

    局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。

    更多内容可参考:C/C++ 中 static 的用法全局变量与局部变量

    初始化局部变量和全局变量

    当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动对其初始化,如下所示:数据类型初始化默认值int0

    char'\0'

    float0

    double0

    pointerNULL

    正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果,因为未初始化的变量会导致一些在内存位置中已经可用的垃圾值。

    数组

    C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。数组中的特定元素可以通过索引访问。

    所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。

    声明数组

    在 C 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:type arrayName [ arraySize ];

    这叫做一维数组。arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C 数据类型。例如,要声明一个类型为 double 的包含 10 个元素的数组 balance,声明语句如下:double balance[10];

    现在 balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字。

    初始化数组

    在 C 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

    大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。

    如果您省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};

    您将创建一个数组,它与前一个实例中所创建的数组是完全相同的。下面是一个为数组中某个元素赋值的实例:balance[4] = 50.0;

    上述的语句把数组中第五个元素的值赋为 50.0。所有的数组都是以 0 作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去 1。

    访问数组元素

    数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。

    C 中数组详解

    在 C 中,数组是非常重要的,我们需要了解更多有关数组的细节。下面列出了 C 程序员必须清楚的一些与数组相关的重要概念:概念描述多维数组C 支持多维数组。多维数组最简单的形式是二维数组。

    传递数组给函数您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。

    从函数返回数组C 允许从函数返回数组。

    指向数组的指针您可以通过指定不带索引的数组名称来生成一个指向数组中第一个元素的指针。

    多维数组

    多维数组声明的一般形式如下:type name[size1][size2]...[sizeN];

    例如,下面的声明创建了一个三维 5 . 10 . 4 整型数组:int threedim[5][10][4];

    二维数组

    一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:type arrayName [ x ][ y ];

    一个二维数组可以被认为是一个带有 x 行和 y 列的表格。下面是一个二维数组,包含 3 行和 4 列:int x[3][4];

    07e6d96290d119070ac2a6070d9fcdd0.png初始化二维数组

    多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有 3 行 4 列的数组。int a[3][4] = {

    {0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */

    {4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */

    {8, 9, 10, 11}   /*  初始化索引号为 2 的行 */};

    内部嵌套的括号是可选的,下面的初始化与上面是等同的:int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};访问二维数组元素

    二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。例如:int val = a[2][3];

    上面的语句将获取数组中第 3 行第 4 个元素。

    下面的程序,我们将使用嵌套循环来处理二维数组:#include 

    int main (){   /* 一个带有 5 行 2 列的数组 */

    int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};   int i, j;

    /* 输出数组中每个元素的值 */

    for ( i = 0; i 

    {      for ( j = 0; j 

    {         printf("a[%d][%d] = %d\n", i,j, a[i][j] );

    }

    }   return 0;

    }

    当上面的代码被编译和执行时,它会产生下列结果:a[0][0] = 0a[0][1] = 0a[1][0] = 1a[1][1] = 2a[2][0] = 2a[2][1] = 4a[3][0] = 3a[3][1] = 6a[4][0] = 4a[4][1] = 8

    传递数组给函数

    如果您想要在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,您也可以传递一个多维数组作为形式参数。

    方式 1

    形式参数是一个指针:void myFunction(int *param){

    }

    方式 2

    形式参数是一个已定义大小的数组:void myFunction(int param[10]){

    }

    方式 3

    形式参数是一个未定义大小的数组:void myFunction(int param[]){

    }

    就函数而言,数组的长度是无关紧要的,因为 C 不会对形式参数执行边界检查。

    从函数返回数组

    C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。可以先跳过本章,等了解了 C 指针的概念之后,再来学习这里的内容。

    如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:int * myFunction(){

    }

    另外,C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。

    下面的函数,它会生成 10 个随机数,并使用数组来返回它们,请注意其中包含了标准库的函数,具体如下:#include #include #include 

    /* 要生成和返回随机数的函数 */int * getRandom( ){  static int  r[10];  int i;

    /* 设置种子 */

    srand( (unsigned)time( NULL ) );  for ( i = 0; i 

    {

    r[i] = rand();     printf( "r[%d] = %d\n", i, r[i]);

    }

    return r;

    }

    /* 要调用上面定义函数的主函数 */int main (){   /* 一个指向整数的指针 */

    int *p;   int i;

    p = getRandom();   for ( i = 0; i 

    {       printf( "*(p + %d) : %d\n", i, *(p + i));

    }

    return 0;

    }

    当上面的代码被编译和执行时,它会产生下列结果:r[0] = 313959809r[1] = 1759055877r[2] = 1113101911r[3] = 2133832223r[4] = 2073354073r[5] = 167288147r[6] = 1827471542r[7] = 834791014r[8] = 1901409888r[9] = 1990469526*(p + 0) : 313959809*(p + 1) : 1759055877*(p + 2) : 1113101911*(p + 3) : 2133832223*(p + 4) : 2073354073*(p + 5) : 167288147*(p + 6) : 1827471542*(p + 7) : 834791014*(p + 8) : 1901409888*(p + 9) : 1990469526

    指向数组的指针

    可以先了解了 C 指针的概念之后,再来学习本章的内容。

    数组名是一个指向数组中第一个元素的常量指针。因此,在下面的声明中:double balance[50];

    balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。因此,下面的程序片段把 p 赋值为 balance 的第一个元素的地址:double *p;double balance[10];

    p = balance;

    使用数组名作为常量指针是合法的,反之亦然。因此,*(balance + 4) 是一种访问 balance[4] 数据的合法方式。

    一旦您把第一个元素的地址存储在 p 中,您就可以使用 p、(p+1)、*(p+2) 等来访问数组元素。下面的实例演示了上面讨论到的这些概念:#include 

    int main (){   /* 带有 5 个元素的整型数组 */

    double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};   double *p;   int i;

    p = balance;

    /* 输出数组中每个元素的值 */

    printf( "使用指针的数组值\n");   for ( i = 0; i 

    {       printf("*(p + %d) : %f\n",  i, *(p + i) );

    }

    printf( "使用 balance 作为地址的数组值\n");   for ( i = 0; i 

    {       printf("*(balance + %d) : %f\n",  i, *(balance + i) );

    }

    return 0;

    }

    当上面的代码被编译和执行时,它会产生下列结果:使用指针的数组值

    (p + 0) : 1000.000000(p + 1) : 2.000000

    (p + 2) : 3.400000(p + 3) : 17.000000

    (p + 4) : 50.000000

    使用 balance 作为地址的数组值(balance + 0) : 1000.000000

    (balance + 1) : 2.000000(balance + 2) : 3.400000

    (balance + 3) : 17.000000(balance + 4) : 50.000000

    在上面的实例中,p 是一个指向 double 型的指针,这意味着它可以存储一个 double 类型的变量。一旦我们有了 p 中的地址,*p 将给出存储在 p 中相应地址的值。

    展开全文
  • B、外部变量作用域是整个源程序 C、可以通过extern,将一些外部变量作用域扩展到多个源文件 D、外部变量若定义为静态的,其他源文件不能使用该外部变量 4、下列选项中关于外部变量正确的是( )。 A、main函数是...
  • Java吸收了C++语言的优点,也展现了其强大的一面,我们能在各个地方看到其功能强大和简单易用的两个特征,当然,也吸引了很多程序员的注意力,所以就有人想了解Java的相关内容,今天就来讲讲Java局部变量的相关内容...
  • java中默认的作用域

    2021-02-28 09:56:59
    马浩编著 第一部分 Java 语言概述 1 选择题 1-1 在下列概念中,Java 语言只保留了 ......(选择一项) a) final b) static c) abstract d) void 答案:C 42)在 Java 中,下面关于变量及其作用域描述错误的是()。...
  • 1. 变量作用域 也就是该变量能生效的范围, 一般是变量定义所在的代码块(大括号) 2. 变量的命名规则 硬性指标: 一个变量名(标识符)只能包含数字, 字母, 下划线,$ 数字不能开头. 变量命名推荐 小驼峰命名法, 当一个...
  • 则以下关于该函数调用的叙述中错误的是A)函数调用可以作为独立的语句存在B)函数调用可以作为一个函数的实参C)函数调用可以出现在表达式中D)函数调用可以作为一个函数的形参考生答案:正确答案:D8.2在调用函数时,如果...
  • 作用域中如何查找变量 解析器运行JS分为哪两个步骤 变量提升步骤和运行过程 函数提升步骤和运行过程 创建对象的三种方式 new的执行过程 遍历对象 1 - 作用域 1.1 作用域概述 通常来说,一段程序代码中所用到的...
  • 作用域是在任何一种程序语言中都不可忽视的概念,只有清楚地知道每种变量作用域,了解它们在什么时候被创建和释放,才能完成一个正确的算法。本文将用简洁的逻辑,介绍C语言中基本的作用域概念和常用的存储类标识...
  • 作用域、链接属性、存储类型的理解 https://www.cnblogs.com/renyuan/archive/2012/11/30/2796801.html https://tnie.github.io/2016/11/03/extern-static-const/ 提示:以下是本篇文章正文内容,下面案例可供...
  • Python变量使用前必须先声明,并且一旦声明就不能再当前作用域内改变其类型。答:×()不属于“零余者”形象特征答:思想大于行动以下关于模糊关系的正确说法是答:模糊关系描述不同论域模糊集合元素之间的关联程度...
  • 1.12、下列关于基本数据类型的取值范围描述中,正确的是: A.byte类型范围是-128~128 B.boolean类型范围是真或者假 C.char类型范围是0~65536 D.short类型范围是-32767~32767 2.22、下列关于整型类型的说法中,正确的...
  • 13.C语言(函数、变量作用范围)单元练习五32(函数、变量作用范围)单元练习五A. f(int array[ ][6]) B. f(int array[3][ ])C. f(int array[ ][4]) D. f(int array[2][5])2. 执行下列程序后, 变量a的值应为______。int ...
  • PHP基础——变量

    2021-04-22 18:00:18
    变量是存储信息的容器实例$x=5;$y=6;$z=$x+$y;echo $z;?>类似代数x=5y=6z=x+y在代数中我们使用字母(比如 x)来保存值(比如 5)。从上面的表达式 z=x+y,我们能够计算出 z 的值是 11。在 PHP 中,这三个字母被称为...
  • 【多选题】以下选项中值为 True 的是 : ( )【单选题】给出下面代码 import ...= 9: break else: num = randon.randint(1,10) 以下选项中描述错误的是 : ( )【单选题】下面代码的执行结果是 : ( ) a = 10.99 prin...
  • 我们也可以理解为,变量就像一个购物袋,我们可以用来装苹果、榴莲(当然也可以用来装玫瑰),需要注意的是,一般情况下一个变量只能装一个(不要太贪心)值,除非是复合变量(后面变量类型时会介绍),...
  • 一、变量 (一)系统变量 说明:系统变量由系统提供,不是用户定义,属于服务器层面。系统变量又分为全局变量和会话变量。 1.全局变量 (1)查看所有的系统变量 语法: SHOW GLOBAL VARIABLES; (2)查看满足条件...
  • php变量有什么用处?php变量是用于存储信息的"容器",php变量可以赋值或者表达式,那么,下面我们就来看一看php变量的命名规则以及php变量的用法。先看一个例子:...
  • JS作用域

    2021-09-16 14:48:36
    文章目录JS作用域变量varvar声明作用域var声明提升let暂时性死区全局声明条件声明for循环中的let声明const作用域链标识符查找作用域链增强作用域链增强 这篇文章主要引用自红宝书《JavaScript高级程序设计》(第四版...
  • A、单词拼写错误检查B、括号不匹配C、加法运算两个操作数的类型不兼容D、寄存器分配正确答案: C 我的答案:C得分: 3.5分2程序设计语言的语义分为静态语义和动态语义,其中编译时能检查的语义是_______.A、静态语义...
  • 作用域是指在程序中定义变量的区域,该位置决定了变量的生命周期(和函数作用域、块级作用域相关)。通俗的理解,作用域就是变量与函数的可访问范围,即作用域控制着变量和函数的可见性和生命周期。而作用域又分为...
  • request对象:在一次请求中,传递数据 response 1;两次请求 两次响应 2;地址栏会发生变化 3;不能携带参数 用户发送的所有的请求都是通过request对象实现,request中携带了请求的地址、参数等等 方法名 描述...
  • B、外部变量作用域是整个源程序 C、可以通过extern,将一些外部变量作用域扩展到多个源文件 D、外部变量若定义为静态的,其他源文件不能使用该外部变量 4、下列选项中关于外部变量正确的是( )。 A、main函数是...
  • C语言在线测考试目及答案C语言在线测试题目及答案第一章、第二章、第三章第一题、单项选择题(每题1分,5道题共5分)1、在以下关于C语言的叙述中,正确的说法是: BA、C语言比汇编语言快 B、C语言比BASIC语言快C、...
  • 定义一个对象或者变量,就是分配空间以及(可能的)赋初值。例如:double x,y,z;char* p;QString message("Hello");定义一个函数,表示在一个C++语句块中完整的描述它的行为。int max(int a,int b) {return a > b ?...
  • (手机上直接回答提交)【单选题】对于 ( ) 作用范围的 Bean, 当客户离开这个页面时 JSP 引擎取消为客户的该页 面分配的 Bean, 释放他所占的内存空间。【填空题】JavaBean 规定成员变量的读 / 写通过 方法和 方法进行...
  • 下面有关值类型和引用类型描述正确的是()? A 值类型的变量赋值只是进行数据复制,创建一个同值的新对象,而引用类型变量赋值,仅仅是把对象的引用的指针赋值给...D 值类型变量作用域主要是在栈上分配内存空间内,
  • 作用域是什么

    2021-12-16 14:57:03
    在我们的例子中, 引擎会为变量 a 进行 LHS 查询。 另外一个查找的类型叫作 RHS。L和R分别代表赋值操作的‘左’和‘右’。LHS和RHS的含义是赋值操作的左侧或右侧,(并不一定意味着就是“=”赋值操作符的左侧或右侧...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 90,565
精华内容 36,226
关键字:

关于变量的作用域,正确的描述是