原文:http://blog.csdn.net/metasearch/article/details/2856097

在C语言编程中,当我们声明一个字符串数组的时候,常常需要把它初始化为空串。总结起来有以下三种方式:

(1) char str[10]=”“;

(2) char str[10]={”};

(3) char str[10]; str[0]=”;

第(1)(2)种方式是将str数组的所有元素都初始化为”,而第(3)种方式是只将str数组的第一个元素初始化为”。如果数组的size非常大,那么前两种方式将会造成很大的开销。所以,除非必要(即我们需要将str数组的所有元素都初始化为0的情况),我们都应该选用第(3)种方式来初始化字符串数组。

================

数组可以初始化,即在定义时,使它包含程序马上能使用的值。

  例如,下面的代码定义了一个全局数组,并用一组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’,”};

  第一种方法用途较广,初始化时,系统自动在数组没有填值的位置用,”补上。另外, 这种方法中的花括号可以省略,即能表示成:

    char array[10]=”hello”;

  第二种方法一次一个元素地初始化数组,如同初始化整型数组。这种方法通常用于输入不容易在键盘上生成的那些不可见字符。

  例如,下面的代码中初始化值为若干制表符:

    char chArray[5]={‘t’,’t’,’t’,’t’,”);

  这里不要忘记为最后的,”分配空间。如果要初始化一个字符串”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位机器之间移植:

  对于字符串的初始化,要注意数组实际分配的空间大小是字符串中字符个数加上末尾的,”,结束符。

  例如,下面的代码定义一个字符数组:

    //*********************

    //**   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语言 字符数组与字符串的更多相关文章

  1. c语言字符数组与字符串的使用详解

    转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ ...

  2. [c语言]字符数组、字符串定义

    C语言中字符串通常用字符指针和字符数组来定义: char* pS="abcdef"; char s[]="abcdef"; 这两种方式都会在结尾为字符串隐式补结 ...

  3. C语言字符数组和字符串

    用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o' ...

  4. C语言字符数组与字符串

    研究几个案例: 输出图案: #include <stdio.h> void main() { ][] = { {', ' ', ' '}, {', ' '}, {'}, {', ' '}, ...

  5. [日常] C语言中的字符数组和字符串

    c语言字符数组和字符串:1.存放字符的数组称为字符数组 char str[]2.'\0'也被称为字符串结束标志3.由" "包围的字符串会自动在末尾添加'\0'4.逐个字符地给数组赋 ...

  6. C语言中字符数组和字符串指针分析

    这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么 用到过C,虽然网上这类的文章也有很多,还是决定自己在这 ...

  7. c语言中的字符数组与字符串

    1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y ...

  8. C语言基础复习:字符,字符数组,字符串,字符指针

    1. 概述2. 字符2.1 字符定义和大小2.2 字符的输入和输出2.3 字符的计算3. 字符数组3.1 字符数组的定义和大小3.2 字符数组的输入和输出3.3 字符数组的计算4. 字符串4.1 字符 ...

  9. C语言中整形数组、字符数组、字符串的区别

    一. 第一 整型数组的存放,数组最后是不加'\0'的,字符串会自动加上,因此存放字符的时候数组的大小要比实际字符的多一个 第二 整型数组 每一个单元是4个字节的,字符串是一个一个字符存放的,每个字符占 ...

随机推荐

  1. po 时不生效时, 不要用点方法

    Dot notation for message sending is not supported in lldb. Use bracket notation and cast the result ...

  2. Wiz开发 定时器的使用与处理

    这只是一些代码片段,由于Wiz开发的资料实在不多,而且内容都不够新. 这里的代码主要参考Tools.Timer这个插件,但是由于内部实现的很多变化,Tools.Timer这个插件基本上已经无法使用了. ...

  3. 【转】Angular运行原理揭秘 Part 1

    当你用AngularJS写的应用越多, 你会越发的觉得它相当神奇. 之前我用AngularJS实现了相当多酷炫的效果, 所以我决定去看看它的源码, 我想这样也许我能知道它的原理. 下面是我从源码中找到 ...

  4. 初次接触Object对象变量

    Object 变量存储为 32 位(4 个字节)的地址形式,其为对象的引用.利用 Set 语句,声明为 Object 的变量可以赋值为任何对象的引用. 第一次注意到还有个数据类型,帮助文件里只有上面这 ...

  5. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (二) 图片验证码的识别

    上一篇文章讲了“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step 一 京东 商品搜索 ...

  6. Loadrunner通过sitescope监控mysql

    1.   Loadrunner通过sitescope监控mysql 1.1. Sitescope下载 第一次在网上下载的是sitescope11.30,安装之后无法破解,所以最后卸载了,重新下载了si ...

  7. 企业移动互联网O2O微信支付流程图

    过去一周里最受关注的应该就是微信了,腾讯合作伙伴大会微信分论坛的火爆现场,没有亲临其境是无法想象的,近3000人报名,2000多人来到现场,试图进入只能容纳300人的会场…… 闲话不表,进入正题吧,本 ...

  8. “Clean Code” 读书笔记序

    最近开始研读 Robert C.Martin 的 “Clean Code”,为了巩固学习,会把每一章的笔记整理到博客中.而这篇博文作为一个索引和总结,会陆续加入各章的笔记链接,以及全部读完后的心得体会 ...

  9. about云资源汇总指引V1.4:包括hadoop,openstack,nosql,虚拟化

    hadoop资料 云端云计算2G基础课程 (Hadoop简介.安装与范例) 炼数成金3G视频分享下载 虚拟机三种网络模式该如何上网指导此为视频 Hadoop传智播客七天hadoop(3800元)视频, ...

  10. Java 8 中 CAS 的增强

    几天前,我偶然地将之前写的用来测试AtomicInteger和synchronized的自增性能的代码跑了一下,意外地发现AtomicInteger的性能比synchronized更好了,经过一番原因 ...