您的位置:首页 > 编程语言 > C语言/C++

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

2015-05-30 17:16 344 查看
    #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

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息