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

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

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

 

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

 

字符串常量:"qwer"

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

 

字符数组:char[5];

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

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

 

 

 

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

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

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

             std::cout<<c;

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

       好了,这么长的一段小字是我的意淫,我猜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','\0'};(正确写法,编译器可以推断出字符串结束符号的位置)

 

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

 

posted @ 2016-12-01 17:54  LT.C#  阅读(3826)  评论(0编辑  收藏  举报