字符数组、字符指针和字符串

   一、字符数组、字符串和‘\0’的关系

                        许多人理不清字符数组和字符指针及字符串之间的关系,其实编译器把它们分得很清楚。
                    字符数组就是元素为字符的数组,而字符串则是以‘\0'(ASCII码值为0x00)为结束字符的字符数组。可见,字符数组并不一定就是字符串。
而对于字符串来说,它是可变长的,因此它无法记录自己的长度。但是,如何来表示字符串的结束呢?它本身没有长度信息,因此必须用一个字符来标记字符串的结束,这就是'\0'的来历。由于字符串的连续性,编译器没有必要通过它的长度信息来提取整个字符串,仅通过一个指向其开头字符的字符指针就能实现对整个字符串的引用。
                  
                   也就是说,如果用一个字符串字面常量来初始化一个字符数组,数组的长度至少要比字符串字面长度大1,因为还要保持结束符'\0'.例如:
                   char array[] = "Hello"
                    数组array的元素为{’H‘,'e','l','l','o','\0'}.

                

    二、字符数组、字符串和字符指针使用误区。

              对于字符数组来说,它并不在乎中间或末尾有没有'\0'结束字符,因为数组知道它自己有多少个元素,况且'\0'字符对它来说,也是合法的元素。问题就在于:你可能会把字符数组当做字符串来使用,可能使用字符指针(例如 char* p)来引用一个字符数组。在这种情况下,用来操作字符串的库函数(例如 strlen, strcpy)等并不知道这个字符串是来自于一个字符数组,因为你传递进入的仅仅是一个字符指针,而字符指针除了它的类型和值外并不包括其他任何信息。这些库函数总是假定你提供的字符指针指向的内存空间中的某个字符存放着那么一个'\0',他们会很傻的直到找到第一个'\0'字符时才会罢休。于是危险出现了:如果此时你的字符数组中没有'\0'结束标志,那么把它当做字符串来使用的时候就会导致“内存访问冲突”或者篡改了其他内存空间。

           如果你能保证总是使用数组下标来访问字符数组中的每个元素,那么就没有必要在字符数组的结尾放一个'\0'。但是我们都无法做出这样的保证,因为在大多数情况下总是把字符数组用做字符串的缓冲区,所以应当在字符数组的结尾处放入这个麻烦的'\0'.

 

三、字符指针的误区

         当你使用字符指针来引用一个字符变量的时候,千万要小心,因为C++/C 默认 char* 表示字符串。
         例如:
                 char ch = 'a'                   //用字符’a'来初始化字符变量ch
                 char *pChar = &ch         //字符指针指向字符变量
                 cout << pChar <<endl;   //错把字符指针当做字符串


         正确的做法是:
                cout << *pChar << endl;  //取一个字符


  

四、字符串拷贝和比较

       字符串的拷贝请使用库函数strcpy 和 strncpy,不要企图用“ = ” 对字符串进行拷贝,因为那是字符指针的复制。
       同理不要用“ == ” “ >= ” " != " 符号直接比较两个字符串,字符串的比较应该是使用strcmp,strncmp等库函数

       对字符串进行拷贝时,要保证函数结束后目标字符串的结尾有'\0'的结束标志。某些字符串函数并不会自动在字符串结尾追加'\0',
       例如strncpy 和strncat,c除非你指定的n值比源串的长度大1,strcpy 和 strcat 会把源串的结束字符一并拷贝到目标中。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值