char[]数组名与指针,以及字符串数组与string的一些比较

    #include <stdio.h>  
    #include <string.h>  
    #include<string>
    #include<iostream>
    using namespace std;
    
      
    void fun(char c[])   
    {  
        printf("%d\n" , sizeof(c)); //数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;所以这里大小为4字节
        cout<<*((c++))<<endl;  //沦落普通指针的数组名,失去常量特性,可以作自增、自减等操作,可以被修改。
        cout<<strlen(c)<<endl;  //也是得到正常的字符串数组长度
        cout<<c[2]<<endl;   //也是可以当一个正常数组查询组内成员
    }  
      
    void fun2( char &c)  //这里&是引用
    {   
        c=65;  //修改引用常量
        printf("%d\n" , sizeof(c));  //既然输入的是字符常量,当然值为1字节
        //cout<<strlen((const char *)c)<<endl;  //崩溃
        //cout<<c[2]<<endl;  //崩溃
    }  
      
    void fun3(char(&c)[9])   //这里&作用为取地址符,(&c)[9]得到原数组,c还是数组名,且保留常量特性,不是一般的指针
    {   
        printf("%d\n" , sizeof(c));  //长度依旧为9
        //cout<<*((c++))<<endl;  //c不可修改,保留数组名的常量特性
        cout<<strlen(c)<<endl;  //字符串长度
        cout<<c[2]<<endl;    //也是可以当一个正常数组查询组内成员
    }  
      
    int main()  
    {  
        char c[] = "12345678";
        double a=2.4;     
        double *p= &a;   //什么类型的指针都是占用四个字节
        string  s="12345678";   
        printf("%d\n%d\n%d\n%d\n%d\n" , sizeof(c),sizeof(s),strlen(c),s.length(),sizeof(p));
        if(s[8]=='\0')
            cout<<"yes"<<endl;
     /*
       1、数组名sizeof 得到的结果是数组长度+1,因为后面加上‘\0’;
       2、string类型在vs2012中占用28个字节,在g++等一般编译器中占用4个字节
       3、strlen()得到的就是真正的字符串长度,当然是没算上结束符‘\0’的;
       4、s.length()得到的是真正的string字符串长度;
       5、什么类型的指针都是占用四个字节,不论是int还是double抑或是什么东东。
       6、全局的std::getline返回std::string,这个不一定是'\0'结尾。有的编译器会加,有的编译器不会加。
            但是,注意:新的C++标准C++11里面规定std::string一定是以'\0'结尾,就看你的编译器有没有实现新标准了。
            istream::getline返回c字符数组,这个一定是'\0'结尾。
            g++以及vs2012得到的string类型后面都是‘\0’结尾。
     */
        cout<<*c<<endl;  //可以知道*c==c[0]

        //做几个小实验
        fun(c);   //这里把数组名当实参
        fun2(*c);    //实参为*c,即为c[0]
        cout<<*c<<endl;  //可以知道fun2 内修改了c[0]值,为引用特性
        fun3(c);  //这里把数组名当实参,不过fun3 与fun有所不同
        return 0;  

    }


结果为:

9

28

8

8

4

yes

1

4

1

7

4

1

A

9

8

3



     
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值