zoukankan      html  css  js  c++  java
  • [速记]关于字符串数组+字符串常量+结束符号''

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

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

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

     字符串常量:"qwer"

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

     字符数组:char[5];

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

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

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

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

                 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也是可行的

     转自:http://www.cnblogs.com/YTYMblog/p/6122970.html

  • 相关阅读:
    类型“System.Windows.Markup.IUriContext”在未被引用的程序集中定义 解决办法
    c# 根据文件流查看文件真实格式
    WPF ListBoxItem 使用Command命令添加双击事件
    MVVM 在使用 ItemsSource 之前,项集合必须为空
    WPF 自定义TextBox,可控制键盘输入内容
    百万数据如何在前端快速流畅显示?
    NodeJS npm 包装包失败的解决方案
    node.js express 4.x 安装指南(Express不是内部或外部命令解决方案)
    IIS8 不能在此路径中使用此配置节。如果在父级别上锁定了该节
    Npoi操作excel
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/7993523.html
Copyright © 2011-2022 走看看