C++primer读书笔记

4.1.有效下标值的重要性

编译器不会检查使用的下标是否有效,程序运行后可能出现问题。

4.2.数组的初始化

如果只对部分初始化,前面的赋值后,后面的部分自动赋值为0.

如果需要全部设置为0,则可以直接在第一个元素处写为0.

例:float a = {0}

4.3.字符串

空字符\0的ASCII码值为0

如果是字符数组,则应该按照字符处理,如果是字符串数组,带有空字符的,则按照字符串处理

字符数组转换成字符串,可以直接用加双引号的方式进行转换。无需特意加一个末尾符

在确定字符数组需要开多大的时候,需要记得把末尾符也算进去

sizeof(字符串数组名)返回的是整个数组的长度,而strlen()返回的是存储在其中的长度,不算空字符

输入时:cin使用空格、制表符、换行符来定义界。

对于面向行的输入:使用getline()通过回车来确定结尾,调用语法为cin.getline()有两个参数,第一个是名称,第二个是字符数

对于面向行的输入:get()有多重辩题,get会留下换行符如果连续使用两个get则第二个get将不会跨过上一个换行符

所以如果想跨过,可以采用cin.get()单独吃掉一个换行符

当上面读取空行时,get()会设置失效位,接下来的输入会被阻断,可以调用cin.clear()进行恢复输入

4.4.String

string可以被合并.

strcpy()将字符串复制到字符数组中第二个数组复制给第一个数组

strcat()将第二个字符数组加入到第一个数组尾部

string类具有自动调整大小的功能

再用strlen()判定字符串长度的时候,如果字符串未初始化,则长度随机,由于空字符的位置来决定。空字符位置由系统进行设置

4.5.结构体struct

C++里面不提倡使用外部变了,但提倡使用外部结构声明

结构体赋值可以在主函数里直接赋值,使用逗号.

例:

struct inflation{

    char name[20];

    float volume;

    double price;

};

int main(){

    inflation guest = {

          "abcd",

           1.88,

           29.99

     }

}

4.6.共用体

union是一种数据格式,能够存储不同的数据类型。但只能同事存储其中的一种类型

https://baike.baidu.com/item/%E5%85%B1%E7%94%A8%E4%BD%93/3874970?fr=aladdin

可以用来节省空间

4.7 枚举

enum提供了创建符号常量的方式,可以用来替代const

enum spec{red,orange,yellow};

spec被称为枚举,其中的元素对应整数值0-2.枚举只有赋值操作符,枚举变量创建出来之后,被赋予的只有定义中的几个值

枚举可以升级为int整形,但是不能从int变成枚举

band = orange + red 这种形式不行,虽然可以有后半部分,但是这是变成了int 不能被重新赋给枚举类型

可以采用转换的形式进行赋值

关于枚举的取值范围:

首先找到上限,找到大于这个最大值的,最小值得2的幂次,将他减去1.便是上限。

如果最小值不小于0,则下限为0,如果小于0则与找法上限一样

4.8 指针和自由存储空间

存储数据必须跟踪的三个属性

信息存储在何处 存储值为多少 存储的信息是什么类型

面向对象变成与传统性编程区别在于,运行阶段进行决策。运行阶段指的是程序正在运行时候,可以根据需求进行变化,二编译阶段则要求不论如何计划不变

指针在使用前一定要被赋予一个地址,不能将普通整数赋予给一个指针。指针与整数也是截然不同的类型

例:int *a ;*a = 12345;

改正为 int *a =  new int

*a = 12345

地址是一个四个字节的值

变量是在编译的时候分配的,有名称的内存。而指针指示为了可以通过名称直接访问的内存提供一个别名,真正的用处在于在运行阶段分配未命名的内存以存储值。

new()将找到一个长度正确的内存块,返回其地址,程序员需要做的是给改地址一个指针。

typename poiuntger_name = new typename

4.8 内存被耗尽

计算机可能会由于没有足够的内存,而无法满足new的请求,此时new将返回0,此时被称为空值指针,所以常被用来表示操作符或者函数失效的时候。

delete(),new()这俩一定要做到配对使用,否则将发生内存泄漏,即被分配的内存再也无法使用了。

4.9 new创建动态数组

静态联编:在编译时直接给予内存空间

动态联编:在编译时不给予空间,在运行时创建

int *a = new int [500]

4.9 关于new与delete的规则说明

不要使用delete释放同一个内存块两次

如果使用new[]为数组分配内存,则应该用delete[]来进行释放

如果使用new[]为一个实体分配内存,则应该使用delete来进行释放

C++primer读书笔记_第1张图片

对空值指针应用delete是安全的

4.10指针算术

如果把指针变量加一,增加的量等于自身加上他指向的类型的字节数

C++primer读书笔记_第2张图片

int main() {
    int* a = (int*)malloc(sizeof(int)*4);//malloc 开辟4个大小为4*sizeof(int)内存空间;
 
    int* b = (int*)calloc(4, sizeof(int));//calloc 相比malloc,它的功能是开辟内存空间后的同时初始化为0;
    int* c = (int*)realloc(b,sizeof(int)*10);//realloc 可以在指定地址空间或者非指定地址空间开辟指定大小的内存空间。
    //   c指针要开辟的空间显然比指定的指定空间要大,就要考虑到原地址空间的容量是否满足再开辟空间的大小,如果不够就要重新寻找合适的内存空间进行开辟。
    //分配成功后,原地址空间自动释放;
    //具体实例可以查看我的关于C语言动态内存管理相关博客。
    
    free(a);  //使用后要记得释放
    free(c);    //同上
   //
    return 0;
}
对指针进行sizeof得到的是指针的长度,即使他指向的是一个数组

解除指针引用

对指针解除引用意味着获得指针指向的值。

指针 存储的是它指向的变量的地址。
解引用, 就是引用它指向的变量的值。
如: int *ptr = a;
那么解引用: *ptr == a

关于指定成员结构的说明

如果结构标识符是结构名,则使用句点,如果是指向结构的指针,则使用箭头。

另一种方式是(*ps).()把星号带上作为一个结构名来引用

 

你可能感兴趣的:(C++读书笔记)