• 数组的初始化


    http://blog.csdn.net/sibylle/archive/2008/01/05/2026915.aspx
    数组的初始化是一个简单的不能再简单,常见的不能再常见的用法。好像没什么可讲的啊,哈哈,不过,你确定对这个问题已经很了解了吗?

    同志,不得不提醒你一下,一旦犯错误,越是常见的用法,产生的危害也就越大,所以强烈建议你把我这篇文章看下去。

    开始之前,题外一句,“实验是检验代码的唯一标准”!
    可以char str[];但是这只是指针,不是数组

    因为C++不允许这样初始化数组

    但是你可以这样
    int n;
    char *str;
    cin>>n;
    str=new((char)n);
    cin.getline(str);
    然后再输入想要的字符串
    (其中n是你要输入字符数+1,因为最后一位是'\n')

    数组的初始化

    在了一些朋友写的代码时,一个简单的数组初始化,把人那个搞的,又是for循环,又是判断长度.

    一般的数组初始化,也就是申请数组的时候我们就初始化,

    1.char buffer[1000] = {0}; //一般的话,我们只将数组初始化为0,然后再使用.

    C++中,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋值给其余的元素.

    2.char buffer[] = {1,2,3,4,5,6}; 数组会自动计数,我们不用指定数字,以免画蛇添足反而出错。

    3.char buffer[1000];  memset(buffer,10,sizeof(buffer)),对于有特殊需要的我们可以这样将数组中的值全部初始化为1个值,没必要用for循环,效率不高。

    但是char buffer[1000]; memset (buffer,0,sizeof(buffer)) ,个人觉得这有点多此一举.


    一、将数组所有元素初始化为0

    1. 大括号形式
    char a[4] = {0};
    long c[4] = {0};

    2. 字符串形式
    char b[4] = "";
    long d[4] = "";

    说明:
    1)上面两种形式实际上都只是将数组的第一个元素置零了,但由于未初始化为0的元素系统会自动初始化为0,所以产生的效果是所以元素都被置零了。但大家不 要误认为{n}的作用是初始化数组的所有元素值为n。需要强调的是,程序员至少必须把数组元素的第一个数组元素初始化为0,才能使剩余的元素自动初始化为 0。也就是说,定义数组后必须要初始化,不要认为不初始化,系统就会自动初始化为0。实际上,把数组初始化为0是在编译时完成的。如果不初始化,那么各数 组元素的值将是随机数。
    2)允许以字符串的形式初始化数组,所以,{0}和""的效果是一样的。而且,有时为了表示里面存的是字符串,使用""更醒目。

    二、将数组所有元素初始化为非0

    1. for循环

    char i = 0;
    char a[4];
    long b[4];

    for (i = 0; i < 4; i++)
    {
        a[i] = 1;
        b[i] = 1;
    }

    结果:

    值的情况:
    a[0] = a[1] = a[2] = a[3] = 0x01;
    b[0] = b[1] = b[2] = b[3] = 0x01;

    内存情况(每行八个字节,值为十六进制表示):
    a:01 01 01 01
    b:00 00 00 01 00 00 00 01
       00 00 00 01 00 00 00 01

    2. memset

    char a[4];
    long b[4];

    memset (a, 1, sizeof (a));
    memset (b, 1, sizeof (b));

    结果:

    值的情况:
    a[0] = a[1] = a[2] = a[3] = 0x01;
    b[0] = b[1] = b[2] = b[3] = 0x01010101;

    内存情况(每行八个字节,值为十六进制表示):
    a:01 01 01 01
    b:01 01 01 01 01 01 01 01
       01 01 01 01 01 01 01 01

    说明:
    1)for循环和memset的只在char型数组时效果相同,其余情况效果不同,请认真区分二者的区别。
    2)对于非char型数组,使用memset时一定要小心,它是按字节进行赋值的,如果你是想将非char型数组的每个元素置为定值,而不是将内存每8位置为定量,最好使用for循环而不是memset。


    三、错误用法

    char a[4] = {1};
    long b[4] = {1};

    结果:

    值的情况:
    a[0] = 0x01, a[1] = a[2] = a[3] = 0x00;
    b[0] = 0x01, b[1] = b[2] = a[3] = 0x00;

    内存情况(每行八个字节,值为十六进制表示):
    a:01 00 00 00
    b:00 00 00 01 00 00 00 00
       00 00 00 00 00 00 00 00

    说明:
    之前已经说了,上面这种用法的结果是只有数组的第一个元素被赋值了。很多人都在用这种方法对数组进行初始化,但实际上这是一个错误的用法,并不能实现将所有元素初始化为同一数组的目的(置零除外)。
  • 相关阅读:
    uva11916 Emoogle Grid (BSGS)
    2016vijos 1-2 股神小L(堆)
    bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)
    Oracle Profile 使用详解--zhuanzai
    通过srvctl add命令添加database信息到srvctl管理器-转
    Oracle Dataguard Standby Redo Log的两个实验
    MySQL数据的主从复制、半同步复制和主主复制详解-转
    解决oralce 11g dg搭建报错:ORA-16664、ORA-16714、ORA-16810问题--转
    oracle分布式事务总结-转载
    日志挖掘Logmnr
  • 原文地址:https://www.cnblogs.com/zjp8023/p/C01.html
Copyright © 2020-2023  润新知