冒泡排序


排序总轮数=元素个数-1
每轮对比次数=元素个数-排序论述-1
二维数组
二维数组定义的四种方式:
1.数组类型 数组名 行数 列数;
2.数组类型 数组名 行数 列数 ={ {数据1,数据2},{数据3,数据4} };
3.数据类型 数组名行数列数 = {数据1,数据2,数据3,数据4};
4.数据类型 数组名 列数={数据1,数据2,数据3,数据4};
二维数组数组名
1.可以查看二维数组首地址
2.可以计算二维数组所占内存大小
函数
值传递
当函数做值传递时,形参的改变不会影响实参
函数的四种形式
1.无参无返
2.有参无返
3.无参有返
4.有参有返
函数的声明
函数可以声明多次,但是只能定义一次
意义:告诉编译器函数的存在,当函数定义在main函数之后时使用
函数的分文件编写
1.创建后缀名为.h的头文件
2.创建后缀名为.cpp的源文件
3.在头文件中写函数的声明
4.在源文件中写函数的定义
指针
定义指针的语法: 数据类型 *指针变量名;
int * p
让指针记录变量a的地址
int a = 10;
p=&a;
可以通过解引用的方式来找到指针指向的内存
*p =100;
指针在32位系统下占用4字节大小,任何数据类型的指针都是4字节
在64位系统下占用8字节大小,任何数据类型的指针都是8字节
空指针:指针变量指向内存中编号为0的空间
空指针用于给指针变量进行初始化
int *p = NULL;
空指针是不可以进行访问的
0---255之间的内存编号是系统占用的,因此不可访问
野指针:指针变量指向非法的内存空间
如int *p=(int*)0x1100;
const修饰指针
int a=10;
int b=10;
1.const修饰指针:
常量指针 const int* p =&a; 指针指向的值不可以修改,但指针的指向可以修改
即*p=20;错误
p=&b;正确
2.const修饰常量:
指针常量 int* const p2=&a;指针指向的值可以修改,指向不能修改
即*p=20;正确
p=&b;错误
3.const修饰指针和常量
const int * const p3=&a;
指向和指向的值都不可改
即*p=20;错误
p=&b;错误
用指针访问数组
int * p=数组名;
数组名就代表了数组的首地址,不需要加取地址符&
指针和函数
利用指针作函数参数,可以修改实参的值(如果是地址传递,就可以修改实参)
结构体
通过结构体定义变量的方式有三种
-
struct 结构体名 变量名
-
struct 结构体名={成员1值,成员2值。。。}
-
定义结构体时顺便创建变量
//结构体定义
struct Student
{
string name;//string是字符串类型
int age;
int score;
}stu3;//结构体创建方式3:定义时直接创建
int main(){
Student s1;//创建结构体 c++中 创建结构体时可以不加struct,但定义时要加
//创建变量
s1.name="张三";//通过 . 来访问结构体
s1.age=18;
s1.score=100;
//第二种定义变量方式 s1={"张三",18,100};
//第三种创建方式:定义时直接创建
/*
stu3.name="张三";//通过 . 来访问结构体
stu3.age=18;
stu3.score=100;
*/
}
结构体数组
创建方法 struct 结构体名 数组名元素个数{ };
struct Student s12={
"张三",10,100;
"李四",12,100;
};
结构体指针
1.创建学生结构体变量
student s={"张三",18,100};
2.通过指针指向结构体变量
student * p = &s;//数据类型为结构体名
3.通过指针访问结构体变量中的值
//通过 结构体指针 访问结构体中的属性时,需要用 ' -> '
cout <<"姓名:"<< p->name << "年龄:" <<p->age<< "成绩:""<< p->score <<endl;
结构体可以通过->来访问结构体中的成员
结构体嵌套结构体
struct student{
string name;
int score;
};
struct teacher{
string name;
struct student stu;
};
结构体作函数参数
1.值传递 2.地址传递
void printfStudent1(struct Student s1){
cout<<"姓名:"<<s1.name<<endl;
}
void printfStudent2(struct Student * s1){
cout<<"姓名:"<<s1->name<<endl;
}
int main(){
printfStudent1(s1);//值传递
printfStudent2(&s1);//地址传递
}
如果想修改主函数中的值 就用值传递 ,反之就用地址传递
结构体中const适用场景
将函数中的形参改为指针(使用地址传递),可以减少内存空间(传指针的话接收的也是指针,而指针只占用四个字节(首元素地址),所以即使是很大的数组最终也只占用4字节),而且不会复制出新的副本出来
(做值传递时会生成一个副本)
void printfstudent(const student *s){
//s->age=100;//加入const之后,一旦有修改操作就会报错,可以防止我们误操作
}