第四章 复合类型(由于赶时间,本章笔记主要以运用、实践为主)
一、数组
1、数组的初始化规则
正确:
- 方式一
- 方式二
- 方式三
错误:
- 方式一(只有在定义数组时才能使用初始化(初始化便是:{1,2,3,4}),此后就不能使用了)
- 方式二(不能将一个数组赋给另一个数组)
-
方式三(自我理解:定义数组时,没给数组长度,也没初始化,所以也就没给它地址和内存空间,等于这个数组作废,没有用)
2、C++11数组初始化方法:
3、得到数组的长度
- 补充:这里的sizeof加不加括号均可。
二、C-风格字符串
1、char类初始化规则
正确:
错误:(三个方法的问题与数组的问题一一对应)
2、char类的长度给定(与数组不同)
- char类:
如果想输出的字符串为 "asdf" ,则:
char a[5] = "asdf" ;(因为char类需要给 \0 留个位置,”asdf“ → {‘a’ , 's', 'd' , 'f' , '\0' })
- 数组:
如果想输出{1,2,3,4},则:
int a[4] = {1,2,3,4};
3、得到char类长度
#include <cstring>
type(数字整型和浮点型都可) a = strlen( char类);
4、字符串与字符串连接
#include <cstring>
- 解释:
strcpy():将字符串复制到字符数组中;
strcat():将字符串附加到字符数组中。
- 例子:
5、其他形式的字符串字面值
- 类型不同
- 输出时的 “ ”
三、string类字符串
1、string类的初始化规则
与python用法相差不大。
2、得到string类长度
type(数字整型和浮点型都可) a = string类.size()
3、字符串与字符串连接
” + “ 连接
四、结构、共用体
1、结构体:
- 结构的组成
- 使用结构体
#include <iostream>
using namespace std;
//方式一:普通版
struct onf
{
char a;
double c ;
};
//方式二:可以用初始化以这种方式创建的变量
struct inf {
char a;
int b[4] ;// 中括号里不能为空,字符串同理
double c ;
}inf_a = {
'a',
{1,2,3,4},
1.2
};
//方法三:同时完成定义结构和创建结构变量的工作
struct enf {
char a ;
double b;
}enf_a;
//方法四 :少用版
struct {
char a;
double b ;
}rnf;
/*------------------------------------------------------------------------------*/
int main(){
// 方法一
onf onf_a {
'a',
1.2
};
cout << onf_a.a;
cout <<endl;
// 方法二
cout << inf_a.a;
//方法三
enf enf_a={ //可省略等号
'a',
1.2
};
//方法四
rnf ={ //注意!!!等号不能省
'a',
1.2 };
return 0;
}
- 结构数组
- 结构中的位字段
- 附加:
如果大括号内未包含任何东西,各个成员都将被设置未零;
不允许窄缩转换。
2、共用体
- 定义:
共用体能够存储不同的数据类型,但只能同时存储其中的一种类型,也就是说,结构可以同时存储int、long 和 double,共用体只能存储int、long 或 double。
- 例子:
- 匿名共用体:
五、指针
1、申明和初始化指针
#include <iostream>
int main(){
using namespace std;
//整型和浮点型
int *a ; // 1、int* a or int * a or int*a 均可; 2、a 为 地址 ;*a为该地址存的内容
//赋值方法
int b = 8;
//方法一:地址
a = &b; // a = 8 or a = &8 or a = &(8)都是错的
//方法二 :内容
*a = b;//*a = 10 直接赋值的方式也可以,但是不能在初始化的时候直接赋值
//方法三:地址简化版
//int *a = &b //这个是简化:方法一的简化
cout<<"地址:"<<a<<endl; // a 为 地址
cout<<"内容:"<<*a<<endl; //*a为该地址存的内容
/*下面的声明创建一个指针(p1)和一个int变量(p2)
int *p1 , p2;
注意:不能直接给指针赋值(例如int *a = 8 )!!!
但是,可以给它地址 :int *a=(int*)0xB8000000
*/
return 0;
}
2、使用new来分配内存与使用delete释放内存
- 注意养成习惯,搭配起来用
数组:
注意:
3、使用new来创建动态数组
#include <iostream>
int main(){
using namespace std;
int *a = new int [500];
char *c_a = new char [500];
int b[]={1,2,3,4};
char d [] = "adsagfc";
/*直接赋值:char 与数字整型、浮点型的区别
//char类
c_a = "sad"; //弹问题,但是能输出(*c_a = "sad"会报错)
//数字整型、浮点型
*a = {1,2,3,4}; //报错
*/
/*一个个赋值:char 与数字整型、浮点型一样
//char类
c_a[0]='a';
//数字整型、浮点型
a[0] = 1;
*/
/*用数组的变量赋值
//char类
c_a = d; //d为字符串内容;c_a = &d:错误
cout << *c_a <<c_a[0]<<*(c_a+1)<<endl; //输出结果:aad;
//数字整型、浮点型
a = b; //b 为数组的地址
cout <<*a<<a[0]<<*(a+1); //输出结果:112;
*/
//得到指针长度
cout<<endl<<sizeof(a);
//得到字符串的地址
cout<<endl<<(int*)c_a;
return 0;
}
- 注意:
4、使用new创建动态结构
#include <iostream>
using namespace std;
struct inf{
int a;
char b;
};
int main(){
/*初始化
//方法一
inf inf_a = {2, 'a'};
inf *inf_A = &inf_a;
//方法二
inf *inf_A;
inf_A = &inf_a; //*inf_A = inf_a;会出现异常
//方法三
inf *inf_A = new inf;
*inf_A = inf_a;// or inf_A = &inf_a
*/
/* “->”的用法
inf *inf_A = new inf;
inf_A -> a = 2;
inf_A -> b = 'a';
cout<< inf_A -> a; //输出:2
*/
return 0;
}
六、模板类vector、array
1、vector类(类似于string类,是动态数组)
2、array类(使用栈,静态内存分布,相对于vector类,效率高)
七、get() 与 getline():面向行的类(这两个类函数都能读取一行输入)
1、getline():丢弃换行符
例子一(char类):
输出:
例子二(string类):
2、get():将换行符保留在输入序列中
例子一(char类):
输出:
例子二(string类):无该使用
3、混合输出(有cin<<year的情况):
- 例子(cin>>year在前):
- 如果cin<<year在后:则可以不加get(),不需要处理换行符
4、get() 与 getline()的区别:
getline()使用起来简单一些,但get()使得检查错误更简单些。
5、空行问题:
八、枚举
略~