C++ Primer Plus: 第四章 复合类型

C++ Primer Plus: 第四章 复合类型

4.1 数组

  • 初始化数组时,提供的值可以少于数组的元素数目:
float a[5] = {5.0, 2.5};

如果只对数组的一部分进行初始化,则编译器将把其他元素设置为0.因此,将数组中所有元素都初始化为0非常简单——只要显式地将第一个元素初始化为0,然后让编译器将其他元素都设置为0即可:

long totals[100] = {0};

如果初始化为{1}而不是{0},则第一个元素被设置为1,其他元素都被设置为0。

字符串
char bird[10] = "abc";        //the \0 is understood
char fish[] = "Bubbles";        //let the compile count
//第一种方式中,空字符自动加到字符串末尾,其余补\0,即从char[3]-char[9]的值都为'\0'
//第二种方式中,会在末尾自动补上'\0'
  • 区别”S”和’S’:”S”不是字符常量,它表示的是两个字符(字符S和\0)组成的字符串。同时,”S”实际上表示的是字符串所在的内存地址。因此下面的语句试图将一个内存地址赋值给temp: char temp = “S”;
  • C++允许拼接字符串字面值,即将两个用引号括起来的字符串合并为一个。事实上,任何两个由空白(空白、制表符和换行符)分隔的字符串常量都将自动拼接成一个。
cout << "I'd give my right ar"
"m to be a great violinist. \n";
  • 区别strlen()和sizeof():sizeof()运算符指出整个数组的长度。strlen()只计算可见的字符,而不把空字符计算在内。

  • 关于输入:

    • cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,这意味着cin在读取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。
    • 面向行的输入:cin.getline(name, 20); getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符,getline()成员函数在读取指定书目的字符或遇到换行符时停止读取。
    • get():函数同getline()函数类似,但是不读取换行符,而是留在输入队列中,所以需要第二次读取来处理换行符:
    cin.get(name, 20);
    cin.get();  //读取换行符
  • string简介:
    char charr[20]; //未被初始化
    int len1 = strlen(charr);
    string str;
    int len2 = strlen(str);
1. 函数strlen()从数组的第一个元素开始计算字节数,直到遇到空字符。对于未被初始化的char[]数据,第一个空字符的出现位置是随机的,因此在运行该程序时,得到数组的长度len1可能不同。
2. 未被初始化的string对象的长度被自动设置为0.因此len2 == 0.
3. **R"(Jim "King" Tutt uses "\n" instead of endl.)"**用来标识原始字符串。输出:Jim "King" Tutt uses \n instead of endl.
  • struct简介:

    1. C++允许在声明结构变量时省略关键字struct
    2. 可以使用赋值运算符(=)将结构赋给另一个同类型的结构,这样结构中每个成员都将被设置为另一个结构中相应成员的值,即使成员是数组。
  • 共用体:

    1. 共用体是一种数据格式,它能够存储不用的数据类型,但只能同时存储其中的一种类型。
    2. 共用体最大长度为其最大成员的长度。
  • 指针:

    1. 显示地址时,cout使用十六进制表示法。
    2. int* 是一种复合类型。
    3. int* p1, p2; p1是指针,p2是int变量。
    4. 指针的值虽然是数值,但不能简单地将数字赋值给指针。需要强制转换:int pt = (int )0xB800000;
    5. 指针被声明在栈(stack)中,new出的内存在堆(heap)中。
    6. 在编译时给数组分配内存被称为静态联编。使用new,在运行阶段创建数组称为动态联编。

4.8 指针、数组和指针算术

  • 对于flower[20] cout << flower; cout对象认为char的地址是字符串的地址,因此它打印该地址处的字符,然后继续打印后面的字符,直到遇到空字符\0为止。
  • 在cout和多数C++表达式中,char数组名、char指针以及引号括起的字符串常量都被解释为字符串第一个字符的地址。
  • const char* bird = “wren”; “wren”实际表示的是字符串的地址,因此这条语句将”wren”的地址赋值给了bird指针。编译器在内存留出一些控件,以存储程序源代码中所有用引号括起来的字符串,并将每个被存储的字符串与其地址关联起来。
  • 强制显示char[]的指针地址,cout << (int*) flower << endl;
  • 深复制:因使用strcpy()或者strncpy()而不是赋值运算符来讲字符串赋值给数组
char animal[20] = "bear";
ps = new char[strlen(animal)+1];
strcpy(ps, animal);
存储类型
  • 自动存储:

    1. 在函数内部定义的常规变量使用自动存储空间,被称为自动变量。这意味着他们在所属的函数被调用时自动产生,在函数结束时消亡。
    2. 自动变量通常存储在栈中。
  • 静态存储

    1. 静态存储是在整个程序执行期间都存在的存储方式。使变量成为静态的方式有两种:一种是在函数外面定义它;另一种是在声明变量时使用关键字static。
    2. 存储在栈中。
  • 动态存储

    1. new和delete运算提供了一种比自动变量和静态变量更灵活的方法。它们管理了一个内存池,这在C++中被称为自由存储空间或堆。该内存池同用于静态变量和自动变量的内存时分开的。
    2. new和delete让程序能够在一个函数中分配内存,而在另一个函数中释放它。因此,数据的生命周期不完全受程序或函数的生存时间控制。
    3. 被泄漏的内存在程序的整个生命周期内都不可食用。这些内存被分配出去,但是无法收回。C++的智能指针有助于解决这个问题。

4.10 数组的替代品

  1. vector和array都是数组的替代品。
  2. vector包含在std名称空间中。
  3. array对象的长度也是固定的,也使用栈(静态内存分配),不是自由存储区。因此效率与数组相同。
  4. array对象和数组存储在相同的内存区域(栈)中,而vector对象存储在另一个区域(自由存储区或堆)中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值