美文网首页
数组的初始化与字符串

数组的初始化与字符串

作者: yikemi | 来源:发表于2017-06-19 12:53 被阅读114次

    1、C/C++数组初始化,数组赋值

    以下赋值方式是错误的:

    [cpp]
    int a4[3] = {};                //无法通过编译;//不能分配常量大小为0的数组 
    char s3[3] = "abc";            //编译错误,数组越界。  
    

    上一段中,第二个例子之所以错误,是因为“abc”是字符串有4个字符,除了a/b/c三个字符之外,还有一个结束字符 '\0'
    摘自:
    http://blog.csdn.net/maxsky/article/details/41547399
    http://blog.csdn.net/lanceleng/article/details/8707745

    2、c/c++数组初始化误区

    int型数组

    int szTmp[256] = {0};
    int szTmp2[256] = {1};
    

    一开始总认为szTmp的值就全部是0,szTmp2的值全部是1。
    结果打印一看,szTmp的值就全部是0,但是szTmp2的第一个值是1,其他的全部是0。

    原因: int szTmp[256]={var}; 第一个元素是显式地初始化为var,其余元素是隐式地初始化为0。

    char型字符型数组

    char str[10]="Hello";
    char str[10]={"Hello"};
    char str[10]={'H','e','l','l','o','\0'};
    char str[10]={'H'};
    char str[10]={0};
    
    char str[10]="Hello, world.\n";//报错
    
    char str[]="Hello, world.\n";
    

    第一种情况:初始化数据小于数组长度
    如前面三个初始化的例子,这三个例子的效果一样,前五个字符为Hello,剩余的用'\0'填充
    第四行与第五行,都只指定了第一个字符,剩余的全部用'\0'填充。第五个例子相当将整个数组初始化为'\0'

    第二种情况:初始化数据等于或超过数据长度,这种情况下,编译报错,溢出。

    第三种情况:不指定数组长度
    这种情况下,数组部分如果不含有明确指定的'\0',那么编译时会被自动添加一个'\0';

    在数组不含有明确的'\0'时,sizeof(str)=strlen(str)+1;

    3、在这里顺便再跟大家一起温习一下数组初始化规则:

    1.指定数组大小的情况下:
    (1)如果初始化时指定的的元素个数比数组大小少,剩下的元素都回被初始化为0。

    例如 int v5[8]={1,2,3,4};等价于 int v5[8]={1,2,3,4,0,0,0,0};

    (2) 如果初始化时指定的的元素个数与数组大小相等,则数组元素就按照列表初始化

    例如 int v5[4]={1,2,3,4};

    2.没有指定数值大小的情况下:
    当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定

    例如 int v5[] ={1,2,3,4}; //数值的大小为4

    4、int a[2];//里面的全是垃圾值

    一般来说 全局变量、静态变量处于数据区,默认初始化为0 (如果指定初始值,则为指定的值)。而局部变量处于栈区,其数值是随机的,即当时内存中的值,全是垃圾值
    总体来说
    不要利用编译器的这种默认原则,
    而是应当显示的指定,
    必要的初始化不是笨拙,
    而是规范。
    参考网址

    5、字符串和字符串结束标志

    最经常使用的是以字符串常量的方式初始化字符数组,并可以省略{}一般的字符数组和数组不省略{}
    static char c[] = "I am happy";
    该字符串长度为11(因字符串常量最后由系统自动增加一个’\0’)
    等价于
    static char c[]={'I',’ ’,'a','m',‘ ','h','a','p','p','y','\0'};

    字符数组并不要求它的最后一个字为‘\0’,甚至可以不包含‘\0’。以下这样写完全是合法的:
    static char c[5]={'C','h','i','n','a'};//合法
    但这样的字符串在printf输出时有风险:
    printf(“%s”,c);//数组最后一个元素不是'\0'导致越界,输出不正常烫烫

    为了使字符数组字符串常量在处理方法一致,便于测定字符序列的实际长度在字符数组中也常常人为地加上一个‘\0’, 如:
    static char c[6]={'C','h','i','n','a','\0'};

    char *str = {"ssss"};//字符串常量*str 和str[] 所存的位置不同,另片细述
    当使用printf()输出时,格式化时选择%s,会输出ssss,由于printf遇到结尾符号‘\0’即停止显示打印。
    字符串“ssss”是个常量,存储在一片连续的内存中,末尾有结尾符表示字符串的结束。
    所有的字符串常量都被放在静态内存区。
    因为字符串常量很少需要修改,放在静态内存区会提高效率。
    参考网址

    C语言中字符串常量到底存在哪了?

    相关文章

      网友评论

          本文标题:数组的初始化与字符串

          本文链接:https://www.haomeiwen.com/subject/hdugqxtx.html