• [速记]关于字符串数组+字符串常量+结束符号''


    其实这个问题已经遇到很多次了,每次都百度,当时都明白了,过一会就忘记了

    现在暂时记录整理一下,有时间作总结

    首先,C语言没有字符串变量,只有字符串常量,所以字符串变量的任务就交给字符数组解决了!

    字符串常量:"qwer"

    嗯,这是一个字符串常量,字符串常量会在结尾加一个结束符'',所以这个字符串常量的实际长度为5

    字符数组:char[5];

    重点来了,这里经常容易错误

    1.首先,这个字符串数组的长度为5,这一定没问题:从c[0]到c[4]。

    2.然后,这其中字符数组必须也有一个结束符号'',它在最后一个有意义的字符之后的一个位置(如果有意义的字符是2个的话,结束字符就在a[2]上,如果有意义的字符是3个的话,结束字符就在a[3]上)

        嗯,到这里,是不是觉得结束字符开始麻烦了,感觉设计C语言的人是不是多此一举呢,Naive!看看下面你就知道为什么要有这个讨人嫌的结束字符了,都是因为                          有字符串常量啊,我们想要字符数组达到字符串变量的效果,就必须要这个字符

                 char c[5]={"qw"};

                 std::cout<<c;

         这两行代码的的输入结果是"qw",有人会想,这个c不是数组名,也就是地址吗?如果这里不明白,建议补补基础知识,这里的c不是地址,是数组名,没有发生自动类型转                换,它能够代表数组,好,那么输出的是字符串数组了,按照道理来说,这个字符串数组是五个长度啊,要输出可是应输出五个来着,后面三个是莫名其妙的东西,这个就               要看字符串数组默认初始化了,可是不管怎样初始化,都要输出五个,这可怎么办?也许输出的是烫烫烫烫烫呢?这个时候,就该结束字符''起作用了,有了结束字符,                 我们就可以直接通过数组名输出所有的字符,不产生任何副作用,这个时候的字符数组名,完全可以当作变量名玩啊

           好了,这么长的一段小字是我的意淫,我猜C语言的设计者应该是这样想的,怎样想到的呢?对比C++,好,不扯了

    3.理解了为什么要有结束字符,接下来就是一些栗子了

    1.char[5]={'q','w','e','r'}(正确写法,末尾自动添加结束符)

    2.char[5]={'q','w','e','r'.'t'};(错误写法,编译器不会报错,输出字符串数组名的时候结尾会有烫烫烫)

    3.char[]={'q','w','e','r'};(错误写法,编译器不会报错,输出字符串数组名的时候结尾会有烫烫烫,因为并不知道字符串的长度,无法推断出结束符的位置,可以理解为编译器不那么智能)

    4.char[]={'q','w','e','r',''};(正确写法,编译器可以推断出字符串结束符号的位置)

    5.char[5]="qwer";(正确写法,末尾自动添加0)

    6.char[5]={"qwer"}(正确写法,末尾自动添加0)

    7.char[5]="qwert"(正确写法,末尾自动添加0)

    8.char[5]={"qwert"}(错误写法,编译器会报错)

    9.char[]="qwer"(正确写法,结尾自动添零,推断出字符串长度)

    10.char[]={"qwer"}(正确写法,结尾自动添零,推断出字符串长度)

    11.char[5];

    a[0]='q'

    a[1]='w'

    a[2]='e'

    a[3]='r'

    (错误写法,编译器不会报错,输出字符串数组名的时候结尾会有烫烫烫)

    结:经过以上分析可以看到

    1双引号的字符串常量写法是最好的

          1.除非算上结束符号之后超过了数组长度,否则都是对的    

                     2.双引号字符串常量的写法会自动添加结束符号,所以不要画蛇添足,自己加结束符号,否则会超过长度)

    2.单引号的写法除了c[5]={‘q’,‘w’,‘e’}则这种既确定了长度,又留有足够空间可以添加结束符号,并且还是采用的初始化列表初始化的,满足这三个条件才才会自动添加0,除此之外不手动加0的全部是错的!

    3.strlen()函数求得是不带'/0'结束符号的字母长度,如果没有遇到结束符号,那么求出的长度肯定大于得到的长度

    4.关于字符数组,字符串常量和“指向字符串的指针”

        char p1[]="abcde";

      char *p2=“abcde”

      p1是字符数组,"abcde"是字符串常量

          p2是"指向字符串的指针"

         char p1[5]; p1="abcde";//这种写法是错误的!,因为数组类型的数据必须初始化,并且不允许直接赋值

         char  *p2;p2="abcde";//这种写法是对的(全局变量,内置类型:包括基本和复合),因为是个指针变量 ,而不是数组,p2可直接访问文字常量区

       char c='c';   

      另外 char*p3=&c也是可行的

    亲爱的听众朋友我是你的代班DJ
  • 相关阅读:
    青春如同奔流的江河,一去不回来不及道别
    关于RESOURCE_SEMAPHORE等待类型
    sql server 2008 The fulltext filter daemon host (FDHost) process has stopped abnormally.
    [转]SQL Server 2008 R2 Pricing
    64bit sql server 2008 sp1 使用lock pages in memory 具体操作
    [转]Fun with Locked Pages, AWE, Task Manager, and the Working Set…
    关掉和开启win7的Windows Search服务
    How to recreate the msdb database in SQL Server 2005
    Kimberly L. Tripp的sp_helpindex2 for sql server 2005/2008,并修复了for sqk2k8的一个bug
    表无索引为什么sp_spaceused 中的index_size不为0
  • 原文地址:https://www.cnblogs.com/YTYMblog/p/6122970.html
Copyright © 2020-2023  润新知