2.C++复合类型

数组

  • 初始化规则

    int cards[4] = {1, 2, 3, 4}; //okay
    int hand[4]; // okay
    hand[4] = {1, 2, 3, 4} // not allowed
    hand = cards; // not allowed, 不允许静态数组相互赋值,必须单个单个赋值。可使用array取代
    
    short things[500] = {1} // 只有第0个元素为1,其他都为0
    

字符串

  • sizeof和strlen

    sizeof(a) //得出字节(byte)数
    strlen // 返回字符数量,末尾的'\0'不计算在内
    
  • 字符串拼接

    如果字符串过长,可以使用两个“”进行字符串拼接

    char str1[] == "AA""BB";
    cout << sizeof(str1) <<endl; // 5
    
  • string类

    #incluede <string>
    string str1;
    string str2 = "ss";
    //string定义的字符串可以自动调整大小,可以动态变化,并且可以使用运算符拼接。
    
    str1 = str2 + str1;
    

结构体

//声明
struct inflatable
{
    char name;
} in, *p;
//访问
in.name;
p->name;
(*p).name;

NOTE

  1. 如果结构标识符是结构名,则使用句点运算符;
  2. 如果结构标识符是指向结构的指针,则使用箭头运算符。

共用体

union id
{
    int i;
    double g;
}

//匿名共用体
struct te
{
    int name;
    union 
    {
        int i;
        double g;
    }
} tei;

// 访问
tei.i = 1;

//普通共用体
struct te
{
    int name;
    union id
    {
      int i;
        double g;
    }
} tei;

// 访问
tei.id.i = 1;

enum 枚举

enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet}

指针

// & 取地址运算符
// * 解除引用运算符
  • 使用new 分配内存 / 使用delete释放内存

    new/delete 操作的是**堆(heap)**空间

    // 创建数据对象指针
    int* p = new int;
    delete p;
    // 创建动态数组
    int* p = new int[5];
    delete [] p;
    
    遵循的原则:
    
    1. 不要使用delete来释放不是new分配的内存
    2. 不要使用delete释放同一个内存块两次
    3. 如果使用new[]为数组分配内存,则应该使用delete[]来释放
    4. 如果使用new,则应该使用delete释放
    5. 对空指针应用delete是安全的
    
  • 指针、数组和指针算术

    在多数情况下,C++将数组名解释为数组的第一个元素的地址。因此可以直接使用地址[索引]访问数组。
    

    NOTE

    double wages[3] = {1.0, 2.0, 3.0};
    double* pw = wages;
    
    
    cout << sizeof(wages) << " = size of wages array" << endl;
    cout << sizeof(pw) << " = size of pw pointer\n";
    
    // 得到结果如下:
    //24 = size of wages array  整个数组的大小
    //8 = size of pw pointer  指针变量的大小
    
    //对于char数组
    const char* str1 = "here";
    char str2[] = "here";
    cout << strlen(str1) << endl;
    cout << strlen(str2) << endl;
    cout << sizeof(str1) << endl;
    cout << sizeof(str2) << endl;
    
    //结果
    // 4
    // 4
    // 8
    // 5
    

    上面对数组名和数组指针使用sizeof时得到的值不同,因为对数组名使用sizeof得到的是数组的长度,对指针应用sizeof得到的指针的长度。所以在double类型指针的结果中,对wage应用sizeof就是24byte,对pw应用sizeof就是8byte;在char类型的指针测试结果中,strlen函数因为以‘\0’为结束,所以结果相同,而sizeof对str1的结果是因为const指针为8byte,C++中“here”为常量字符串,必须为const指针类型指向内存或用数组保存。

数组的替代品,vector和array都是数组,都可以按照数组的方式访问

  • vector模板类-动态数组的替代品, 使用堆存储

    #include <vector>
    using namespace std;
    
    vector<int> vi; // create a zero-size array of int
    vector<double> vd(n); // create an array of n doubles
    
  • array模板类- 静态数组的替代品, 使用栈存储

    #include <array>
    using namespace std;
    
    array<int, 6> ai;
    array<int, 3> ad = {1, 2, 3};
    // 与普通数组用法相同
    

NOTE

  1. 无论数组、vector对象或者array对象,都可以使用标准数组表示法来访问各个元素,例如a[0]

  2. array对象和数组存储在相同的内存区域-栈中,而vector对象存储在堆中

  3. array对象与数组不同的地方在于,一个array对象可以直接复制给另一个array对象,而标准数组不允许,必须单个值拷贝。

    array<int, 10> ar1;
    array<int, 10> ar2={1,1,2};
    ar1 = ar2; // allowed!
    
    int a[10];
    int b[10] = {1,1,2};
    a = b; // not allowed;
    
  4. stl的数组可以避免索引越界,但仅在使用a.**at(-2)**成员函数时才有效,效率对比a[-2]要低一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值