码迷,mamicode.com
首页 > 编程语言 > 详细

C++学习 -- 复合类型

时间:2020-01-31 18:43:34      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:struct   pre   指针   amp   地方   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]要低一些。

C++学习 -- 复合类型

标签:struct   pre   指针   amp   地方   c++学习   定义   数组指针   空指针   

原文地址:https://www.cnblogs.com/konoleoda/p/12245940.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!