数组

(1)char类型与string类型的区别

1.从本质上说,char字符型,是一个基本数据类型,长度固定,为一个字节;string字符串型,是一个模板类型,本身并不固定长度,而取决于内部包含的字符,也就无法能过sizeof确定字节了,但可以通过.length()来计算出长度。

<例> char c='a';
         string s="123456";
         cout<<sizeof(c)<<"\n";
         cout<<s.length()<<"\n";                →1 →6

2.char用单引号表示,如'a'、'B'、'$'、' '。只能包含一个字节。现在情况出现了。

(1)当单引号里面的内容超过一个字节时,系统会自动截取一个字节的内容给char变量,忽略其他的字节内容。

<例>char c='123456';//报错:too many characters in constant
        cout<<c<<"\n";

    cout<<sizeof(c)<<"\n";               →1 →1

<例>char c='1234';//注意与上一例的不同,大于4个字节才会报错。这又是为什么呢?在C++中char 类型处理和储存是以int类型操作的,int是4个字节,32位内存单元,也就是说,c仍然储存在8位单元的内存中,C的值1234刚好放在32位的内存单元中,再多一个就放不下了。

    cout<<c<<"\n";

    cout<<sizeof(c)<<"\n";

→4 →1 //C++中将判断为4个字节,即1 2 3 4,而char只有一个字节,必然有部分要走开,系统将自动截取最后一个字节4作为初始值。为什么?因为在x86平台上,数据是以little-endian的形式排列的,低位字节放在内存的低地址,高位字节放在内存的高地址。我们看'1234',从左到右从1到4,然而在计算机中存放的格式是从0x04到0x01,所以当把'1234'给变量a时,系统把内存中的地址中存放的4给a,其余的全部不要了。

<例>char c;//注意与上一例的不能之处,这里并没有初始化

    cin>>c;//不妨输入1234
        cout<<c<<"\n";

    cout<<sizeof(c)<<"\n";

→1 →1 //为什么是1而不是4?很简单,因为char是字符型,标准是容纳一个字节,所以它读取1后就输出,对于你的234它根本看都没看一眼,直接PASS了。

(2)当char赋值正确的用ASII表中的字符,如'!',单引号里面的内容是什么,cout就会输出什么。
      <例> char c='!'; //有单引号
           char d=65; //无单引号
           cout<<c<<"\n";
           cout<<sizeof(c)<<"\n";
    (3)当给char变量用一个整形字面字初始化时,系统会根据在ASII表中这个整型值代表的控制字符是什么,就会输入什么。ACSII码为0~127共128个,如果当大于127的整数甚至是大于255给char时,系统的运行结果未知。

<例>char c=110;
        cout<<c<<"\n";

→n

(4)char型有有signed char和unsigned char的区分,signed char 有符号的char,取值范围是-128到127,unsigned char 无符号的char,取值范围是0到255。char类型可以用来表示整数的。既然是可以用来表示整数,就有正负之分了。例如,我们要表示一个整数,它的取值范围比较小,不会超过255.那么此时,我们就可以直接用unsigned char,而不必用short(2个字节),更没有必要用int(4个字节)了。

3.string用双引号表示,如“123456”,正如VB.ENT的string,但这里它不是基本数据类型,而是类。 string中每个字符都用2个字节保存, string的最后还有一个特殊的字符,是不可见的,\0 。它也是占两个字节,不能用szieof确定字节,否则会报错,但还可以通过其它方式获取长度,如strlen就是用来获取字符串长度的函数。

string有没有上限呢?理论上是受内存限制。但一般可以认为是2G(2的31次方)

  另外,在使用char或者string的时候,不要忘记有一些字符是比较特殊的,也就是所谓的“转义字符”,例如\n表示换行,\t表示tab键等。

 

(2)数组定义时,必须指定维数!

              const size_t arry_size=10;

              char a[arry_size];

 

(3)不同类型的初始化、赋值、输出:

#include<iostream>
#include<string>
#include<vector>

using namespace std;

int main()
{
    const size_t arry_size=4;     //const一定不能缺少,否则下面的语句是错误的!
    char a1[arry_size]="C++",a2[arry_size];

    string str1="C++",str2;
    vector<string> vec1(1,"C++"),vec2;

    for(size_t ix=0;ix!=arry_size;++ix)
    {
       a2[ix]=a1[ix];
       cout<<a2[ix];
    }
    cout<<endl;

    str2=str1;
    cout<<str2;
    cout<<endl;

 
    for(vector<int>::size_type index=0;index!=vec1.size();++index)//vector subscript out of range!
    {
       vec2[index]=vec1[index];
       cout<<vec2[index];
    }
    cout<<endl;
 

    return 0;
}

 

(4)vector的遍历可以使用下标和迭代器两种方法实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值