字符数组的特殊性

在讨论她的他特殊性之前我们先来说一下,为什么就只有字符数组不一样呢!
原因是:设计者认为如果存储的是字符数组,单单取出某个字符是没有任何意义的.所以编译器就字符串进行了特殊的处理.
下面就来看看她的特殊性都体现在哪些方面:
1,初始化
通用的数组初始化方法对于字符数组同样适用
1.指明数组大小
char c[4] = {'a', 'b', 'c'};
2.由初始化元素决定数组大小
char c[] = {'a', 'b', 'c', '/0'};
char c[] = {'a', 'b', 'c', 0}; //0是/0的ASCII码值
注意:
    如果采用上述方法初始化,不要忘了结束标记'/0',不加结束标记引起的后果见例题.

字符数组的特殊初始化方法:
1.采用cin语句初始化
char c[100];
cin>>c;
2.使用字符串直接初始化
char c[] = "Hello";

以上还有一个不同的地方是:采用cin语句初始化的时候,声明和初始化已经分开了!也只有字符数组可以这样做!

2,赋值
对变量的第一次赋值也称为初始化.

普通数组的赋值要足个元素进行赋值.(理解一下赋值和初始化的区别)
字符数组的赋值可以调用strcpy完成.
例如:
int i[10];
i[0] = 12;
i[1] = 2;
... ...

char c[20];
strcpy(c,"Hello");

3,运算
这里主要说说字符数组的比较大小
普通数组来比较大小,一般都是通过一个循环来实现.
字符数组的比较有个专门的函数strcmp来实现,具体实现见例2.

4,输出
打印普通数组,显示地址
打印字符数组,显示其内容.

char_array_sample1.cc

      1 #include<iostream>
      2 using namespace std;
      3
      4 int main(){
      5     int a[] = {1,2,3};
      6     char c[] = {'a','b','c'};//,'/0'};
      7     //char c[] = {'a','b','c',0};
      8     //char c[4] = {'a','b','c'};
      9     char c1[] = "abcdef";
     10     cout<< "a: " << a << endl;//打印整形数组名,输出的为整个数组的首地址
     11     cout<< "c: " << c << endl;//打印字符数组名,输出的为整个数组的元素
     12     cout<< "c1: " << c1 << endl;
     13     cout<< "sizeof a : " << sizeof(a) << endl;
     14     cout<< "sizeof c : " << sizeof(c) << endl;
     15     cout<< "strlen(c) : " << strlen(c) << endl;
     16     cout<< "sizeof c1: " << sizeof(c1) << endl;
     17     return 0;
     18 }

执行结果:
a: 0xbfffefb0
c: abcB
  B革??9?
c1: abcdef
sizeof a  : 12
sizeof c  : 3
strlen(c) : 17
sizeof c1 : 7

到这里,可能会有疑问了:
为什么sizeof(c)等于3,而strlen(c)等于17?
对于sizeof来讲,它是以你的初始化列表决定的,初始化列表中只有'a' 'b' 'c' 三个元素,所以其值为3
而strlen,它的参数为字符数组的首地址,它会从这个地址一只查下去,直到'/0'结束,所以在这里显示的为错误值17.

char_array_sample2.cc

     1 #include<iostream>
      2 using namespace std;
      3
      4 int main(){
      5     char name[50];
      6     char name2[50];
      7     memset( name, 0, sizeof(name) );
      8     memset( name2, 0, sizeof(name2) );
      9     cout<<"strlen( name ) = " << strlen( name ) << endl;
     10     strcpy( name, "hello world" );
     11     cout<<"strlen( name ) = " << strlen( name ) << endl;
     12     cout<<"name = > " << name << endl;
     13
     14     //strcpy( name2, name );
     15     strcpy( name2, "have a nice day" );
     16     cout<<"name2 = > " << name2 << endl;
     17
     18     if(strcmp(name, name2) == 0){
     19         cout<<"equals" << endl;
     20     }else{
     21         cout<<"not equals" << endl;
     22     }
     23
     24     /*这样进行比较,只是比较了两个指针的大小
     25     if(name == name2){
     26         cout<<"name equals name2" << endl;
     27     }else{
     28         cout<<"name doesn't equals name2" << endl;
     29     }
     30     */
     31
     32     return 0;
     33 }

char_array_sample3.cc
      1 #include<iostream>
      2 using namespace std;
      3
      4 int main(){
      5     char name[50] = "liucy";
      6     cout<<"name = " << name <<endl;
      7
      8     char* pname = "liucy";
      9     cout<<"pname = " << pname <<endl;
     10
     11     strcpy( name, "huxinzhe" );
     12     cout<<"name : " << name <<endl;
     13
     14     //strcpy( pname, "huxinzhe" ); //an error
     15     //cout<<"pname : " << pname <<endl;
     16
     17     return 0;
     18 }
这个例子稍微难点:
第5行应该没问题,这是字符数组初始化的特殊性之一
第8行可能优点问题,因为数组的本质就是指针,所以char 类型的指针也可以这样初始化.
只是有一点要注意,这时的"liucy"是放到数据区的字面量,通过赋值运算符将它的地址付给了pname ,这个时候可以知道pname是指针常量,它所指向的空间里的内容不允许修改.所以第14行是个错误.
为什么name可以被从新赋值,因为它本身指向一个50字节大小的空间,name的赋值过程实际上是一个字符拷贝的过程.
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值