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来进行释放
对空值指针应用delete是安全的
4.10指针算术
如果把指针变量加一,增加的量等于自身加上他指向的类型的字节数
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).()把星号带上作为一个结构名来引用