【C++】字符串——字符数组和字符指针浅谈

      

      在用C++的时候,只要一碰到字符串相关的应用就头疼,因此特意写下一篇总结,一来算作学习C++的心得吧,二来也是为了提醒自己,错误不要重复犯。

      虽说C++有string类型,无奈我就没有用成功过。所以在此就省去string的心得了。


  | 概述区别

       我也看了很多博客介绍二者,在此就用我自己的语言复述一遍,加深印象。

       其实字符指针和字符数组是差不多的。当二者定义一个字符串时:

              char  *num = " 123456 ";

              char  _num[ ] = " 123456 ";

       字符串" 123456 "被存放在了一个连续的空间,每个字符都有一个相应的地址,但是若是这样来查找字符岂不是太麻烦。因此我们用字符指针和字符数组来方便我们操作这串字符。

       第一行的num是一个指针(注意不是 *num),它存放的是一个地址,即字符串" 123456 "的首地址。 其实正如其名“指针”,它就像一个指针一样,指向了字符串,有一个方向引导的形象。

       而_num则是数组的名字,而数组名则默认为数组的首地址。因此_num实际上也是一个地址,指向一个数组。

       所以不难发现,当如下调用函数的时候,是没有问题的:

                        char test ( char *num){

                            /*...*/

                          }

                         void main(){

                             char _num[ ] = " 123456 " ;

                             test ( _num );

                          }


  | 赋值区别

       1、字符数组赋值字符串:① 直接在定义之后输入;② 用循环一个个赋值; ③ 直接赋值。

             ① cin >> _num ;

             ② for ( int i = 0; i < MAX ; i ++){

                   cin >> _num [ i ];

                 }

             ③ char _num [ ] = " 123456 ";


       2、字符指针赋值字符串:① 用字符串赋值字符串; ② 直接赋值;

             ① char _num [ ] = " 123456 ";

                 char *num ;

                 num = _num;

             ② char *num = " 123456 " ;



        Tips:  

        1、字符指针一定要先指向一个确定的地址才能使用。

                 char *num ;

                 cin >> num;

             错误。因为此时ch还没有指向一个确定的地址,是个野指针。正确的应该是:

                 char *num, _num [ 80 ];

                 num = _numr;

                 cin >> num ;

             此时 ch 有了一个确切的地址,即 _num,因此可以直接输入。

             同时可以看到,在输入输出的时候,可以直接输入输出字符串名。


         2、" 123456 " 这种带引号的字符串本身是一个地址,即 自身的首地址 。

              ① char _num[ 10 ] ;

                  _num = " 123456 " ;    // error!  _num是一个首地址,在数组定义的时候就确定了,为常量。而 " 123456 " 也为一个常量地址。 两个常量不可相互赋值。  

              ② char *num ;

                  num = " 123456 " ;  // correct

    


      现在想到的就这么多啦。

      关于C++字符串更深的东西,比如内存分配,可以看看这个 http://blog.sina.com.cn/s/blog_4c70701801015n3t.html 。

      以后想起来再补充吧~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值