`

C语言的静态数组初始化

 
阅读更多

数组可以初始化,即在定义时,使它包含程序马上能使用的值。
  例如,下面的代码定义了一个全局数组,并用一组Fibonacci数初始化:
    int iArray[10]={1,1,2,3,5,8,13,21,34,55); //初始化
    void main()
    {
      //...
    }

  初始化数组的值的个数不能多于数组元素个数,初始化数组的值也不能通过跳过逗号的方式来省略,这在C中是允许的,但在C++中不允许。
  例如,下面的代码对数组进行初始化是错误的:
    int arrayl[5]={1,2,3,4,5,6}; //error: 初始化值个数多于数组元素个数
    int array2[5]={1,,2,3,4}; //error:初始化值不能省略
    int array3[5]={1,2,3,}; //error:初始化值不能省略
    int array4[5]={}; //error:语法格式错误
    void main()
    {
      //...
    }

  初始化值的个数可少于数组元素个数。当初始化值的个数少于数组元素个数时,前面的按序初始化相应值, 后面的初始化为0(全局或静态数组)或为不确定值(局部数组)。
  例如,下面的程序对数组进行初始化:
    //*********************
    //**   ch7_2.cpp  **
    //*********************

    #include <iostream.h>

    int array1[5]={1,2,3};
    static int array2[5]={1};

    void main()
    {
     int arr1[5]={2};
     static int arr2[5]={1,2};

     int n;
     cout <<"global:\n";
     for(n=0; n<5; n++)
       cout <<" " <<array1[n];

     cout <<"\nglobal static:\n";
     for(n=0; n<5; n++)
       cout <<" " <<array2[n];

     cout <<"\nlocal:\n";
     for(n=0; n<5; n++)
       cout <<" " <<arr1[n];

     cout <<"\nlocal static:\n";
     for(n=0; n<5; n++)
        cout <<" " <<arr2[n];
     cout <<endl;

    }

  运行结果为:
    global:
     l  2  3  0  0
    global static:

     1  0  0  0  0
    local:
     2 23567 23567 23567 23567
    local static:
     1  2  0  0  0

  例中,全局数组和全局静态数组的初始化是在主函数运行之前完成的,而局部数组和局部静态数组的初始化是在进入主函数后完成的。
  全局数组arrayl[5]对于初始化表的值按序初始化为1,2,3,还有两个元素的值则按默认初始化为0。
  全局静态数组array2[5]与全局数组的初始化情况一样,初始化表值(1)表示第1个元素的值,而不是指全部数组元素都为1。
  局部数组arrl[5]根据初始化表值的内容按序初始化, 由于初始化表值只有1个,所以还有4个元素的值为不确定。在这里均为数值23567。
  局部静态数组arr2[5]先根据初始化表按序初始化,其余3个数组元素的值默认初始化为0。

2.初始化字符数组

  初始化字符数组有两种方法,一种是:
    char array[10]={"hello"};
  另一种是:
    char array[10]={'h','e','l','l','\0'};
  第一种方法用途较广,初始化时,系统自动在数组没有填值的位置用,'\0'补上。另外, 这种方法中的花括号可以省略,即能表示成:
    char array[10]="hello";此数组的长度应声明为6,注意最后还有'\0'
  第二种方法一次一个元素地初始化数组,如同初始化整型数组。这种方法通常用于输入不容易在键盘上生成的那些不可见字符。
  例如,下面的代码中初始化值为若干制表符:
    char chArray[5]={'\t','\t','\t','\t','\0')
  这里不要忘记为最后的,'\0'分配空间。如果要初始化一个字符串"hello",那为它定义的数组至少有6个数组元素。
  例如,下面的代码给数组初始化,但会引起不可预料的错误:
    char array[5]="hello";
  该代码不会引起编译错误,但由于改写了数组空间以外的内存单元,所以是危险的。

3.省略数组大小

  有初始化的数组定义可以省略方括号中的数组大小。
  例如,下面的代码中数组定义为5个元素:
    int a[]={2,4,6,8,10};
  编译时必须知道数组的大小。通常,声明数组时方括号内的数字决定了数组的大小。有初始化的数组定义又省略方括号中的数组大小时,编译器统计花括号之间的元素个数,以求出数组的大小。
  例如,下面的代码产生相同的结果:
    static int a1[5]={1,2,3,4,5};
    static int a2[]={1,2,3,4,5};

  让编译器得出初始化数组的大小有几个好处。它常常用于初始化一个元素个数在初始化中确定的数组,提供程序员修改元素个数的机会。
  在没有规定数组大小的情况下,怎么知道数组的大小呢? sizeof操作解决了该问题。 例如,下面的代码用sizeof确定数组的大小:

    //*********************
    //** ch7_3.cpp **
    //*********************

    #include <iostream.h>

    void main()
    {
     static int a[]={1,2,4,8,16};
     for(int i=0; i<(sizeof(a)/sizeof(int)); i++)
      cout <<a[i] <<" ";
     cout <<endl;
    }

  运行结果为:
    1 2 4 8 16
  sizeof操作使for循环自动调整次数。如果要从初始化a数组的集合中增删元素,只需重新编译即可,其他内容无须更动。
  每个数组所占的存储量都可以用sizeof操作来确定! sizeof返回指定项的字节数。sizeof常用于数组,使代码可在16位机器和32位机器之间移植:
  对于字符串的初始化,要注意数组实际分配的空间大小是字符串中字符个数加上末尾的,'\0',结束符。
  例如,下面的代码定义一个字符数组:

    //*********************
    //**   ch7_4.cpp  **
    //*********************

    #include <iostream.h>

    void main()
    {
     char ch[]="how are you";

     cout <<"size of array: " <<sizeof(ch) <<endl;
     cout <<"size of string: " <<strlen("how are you")            <<endl;
    }


  运行结果为:
    size of array:12
    size of string:ll

  例中,数组大小为12,而字符串长度为11。
  省略数组大小只能在有初始化的数组定义中。
  例如,下面的代码将产生一个编译错误:
    int a[];//error:没有确定数组大小
  在定义数组的场合,无论如何,编译器必须知道数组的大小。

分享到:
评论

相关推荐

    c语言二维数组初始化.pdf

    C语言中初始化二维数组的方法有多种,以下是其中几种常见的方法: 1. 使用双重循环遍历赋值: 2. 使用静态方式初始化: 3. 使用动态方式初始化: 需要注意的是,在使用静态方式初始化时,如果未指定初始值,数组...

    c语言程序与设计课件

    最全面,最系统的c课件 ...C语言规定,只有静态存储和外部存储数组才能初始化。方法见下例: static int a[10]={0,1,2,3,4,5,6,7,8,9}; a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 0 1 2 3 4 5 6 7 8 9

    C语言程序设计(PDF格式)

    5.4.1 数组初始化 85 5.4.2 变长数组的初始化 86 5.5 应用程序举例 87 第6章 指针 91 6.1 指针与指针变量 91 6.2 指针变量的定义与引用 92 6.2.1 指针变量的定义 92 6.2.2 指针变量的引用 93 6.3 指针运算符与指针...

    C语言程序设计(高清PDF)

    5.4.1 数组初始化 85 5.4.2 变长数组的初始化 86 5.5 应用程序举例 87 第6章 指针 91 6.1 指针与指针变量 91 6.2 指针变量的定义与引用 92 6.2.1 指针变量的定义 92 6.2.2 指针变量的引用 93 6.3 指针运算符与指针...

    C语言讲义.doc

    8.2 字符数组初始化 39 8.3 字符数组使用 40 8.4 随机数产生函数RAND与SRAND 40 8.5 用SCANF输入字符串 40 8.6 字符串的结束标志 41 8.7 字符串处理函数 41 8.7.1 gets 41 8.7.2 fgets函数 41 8.7.3 puts函数 42 ...

    《C语言程序设计》-PDF格式

    5.4.1 数组初始化 85 5.4.2 变长数组的初始化 86 5.5 应用程序举例 87 第6章 指针 91 6.1 指针与指针变量 91 6.2 指针变量的定义与引用 92 6.2.1 指针变量的定义 92 6.2.2 指针变量的引用 93 6.3 指针运算符与指针...

    谭浩强 入门c语言教程

    7.3.2 字符数组的初始化 9 7.3.3 字符数组的引用 10 7.3.4 字符串和字符串结束标志 10 7.3.5 字符数组的输入输出 10 7.3.6 字符串处理函数 12 7.4 程序举例 14 7.5 本章小结 17 8 函 数 1 8.1 概述 1 8.2 函数定义的...

    PC_Lint C/C++ 软件代码 静态分析工具

    它进行程序的全局分析,能识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针,冗余的代码,等 等。软件除错是软件项目开发成本和延误的主要因素。PClint能够帮你在程序动态测试之前发现编码错误...

    谭浩强c语言程序设计

    7.1.3 一维数组的初始化 84 7.1.4 一维数组程序举例 84 7.2 二维数组的定义和引用 86 7.2.1 二维数组的定义 86 7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 ...

    c语言链表的基本操作实现

    C语言链表的基本操作主要包括**初始化、创建节点、插入节点、删除节点和查找节点**。具体如下: 1. **初始化**:创建一个空的链表,通常指创建一个头指针,该指针指向NULL,表示链表的开始。 2. **创建节点**:在...

    C语言程序设计.rar

    5.4.1 数组初始化 85 5.4.2 变长数组的初始化 86 5.5 应用程序举例 87 第6章 指针 91 6.1 指针与指针变量 91 6.2 指针变量的定义与引用 92 6.2.1 指针变量的定义 92 6.2.2 指针变量的引用 93 6.3 指针运算符与指针...

    C语言程序设计标准教程

    数组初始化赋值数组初始化赋值是指在数组说明时给数组元素赋予初值。 数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。  初始化赋值的一般形式为: static 类型说明符 数组名[常量表达式]={值,值...

    谭浩强 C语言程序设计 教程全书 Word版

    7.3.2 字符数组的初始化 9 7.3.3 字符数组的引用 10 7.3.4 字符串和字符串结束标志 10 7.3.5 字符数组的输入输出 10 7.3.6 字符串处理函数 12 7.4 程序举例 14 7.5 本章小结 17 8 函 数 1 8.1 概述 1 8.2 函数定义的...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    5.13 默认初始化 5.14 递归 5.15 例子:汉诺塔 5.16 总结 5.17 练习 第6章 数组、指针和字符串 6.1 一维数组 6.1.1 初始化 6.1.2 下标 6.2 指针 6.3 传引用调用 6.4 数组和指针之间的关系 6.5 指针运算和元素的大小 ...

    谭浩强版c语言程序设计

    7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 7.3.1 字符数组的定义 89 7.3.2 字符数组的初始化 89 7.3.3 字符数组的引用 90 7.3.4 字符串和字符串结束标志 91 6 7.3.5 字符数组的输入输出...

    《C语言程序设计》谭浩强

    7.1.3 一维数组的初始化 84 7.1.4 一维数组程序举例 84 7.2 二维数组的定义和引用 86 7.2.1 二维数组的定义 86 7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 ...

    C语言入门经典(第4版)--源代码及课后练习答案

    5.7 多维数组的初始化 187 5.8 设计一个程序 191 5.8.1 问题 192 5.8.2 分析 192 5.8.3 解决方案 193 5.9 小结 200 5.10 习题 200 第6章 字符串和文本的应用 201 6.1 什么是字符串 201 6.2 处理字符串和...

    51单片机C语言编程基础及实例

    else //读取 P1.1,就是认为 P1.1 为输入,如果 P1.1 输入高电平 VCC } //给 P0_4 赋值 0,引脚 P0.4 就能输出低电平 GND //初始化。P1.1 作为输入,必须输出高电平 //非零表示真,如果为真则执行下面循环体的语句 ...

    c语言程序设计(第三版)

    7.2.3 二维数组的初始化 7 7.2.4 二维数组程序举例 9 7.3 字符数组 9 7.3.1 字符数组的定义 9 7.3.2 字符数组的初始化 9 7.3.3 字符数组的引用 10 7.3.4 字符串和字符串结束标志 10 7.3.5 字符数组的输入输出 10 ...

    c语言(编写程序最佳参考资料)

    7.3.2 字符数组的初始化... 9 7.3.3 字符数组的引用... 10 7.3.4 字符串和字符串结束标志... 10 7.3.5 字符数组的输入输出... 10 7.3.6 字符串处理函数... 12 7.4 程序举例... 14 7.5 本章小结... 17 8 函 数...

Global site tag (gtag.js) - Google Analytics