一、数组
1、概述
所谓数组,就是一个集合,里面存放相同类型的数据元素
特点:
1、数组中的每个数据元素都是相同的数据类型
2、数组是由连续的内存位置组成的
2、一维数组
(1)、定义方式:
一维数组有中定义方式:
1、
数据类型 数组名[数据长度];
2、
数据类型 数组名[数据长度] = {值1,值2.....};
3、
数据类型 数组名[] = {值1,值2......};
示例:
int main() {
//一维数组定义
//方式1
int arr[5] = {0};
//方式2
int arr1[5] = { 1,2,3,4,5 };
//方式3
int arr2[] = { 6,7,8,9,0 };
cout << "数组1:";
for (int i = 0; i < 5; i++) {
cout << arr1[i] ;
}
cout << "\n数组2:";
for (int i = 0; i < 5; i++) {
cout << arr2[i];
}
cout << "\n";
system("pause");
return 0;
}
(2)、数组名:
用途:
1、用来统计整个数组在内存中的长度
2、可以获取数组在内存中的首地址
示例:
练习案例:
1、五只小猪称体重
案例描述:
在一个数组中记录了五只小猪的体重,如:int arr[5] = {300,350,200,400,250};找出并打印最重的小猪体重
代码示例:
int main() {
//五只小猪称体重
int weight = 0;
int arr[5] = { 12,34,56,78,43 };
for (int i = 0; i < (sizeof(arr) / sizeof(arr[0]));i++) {
if (weight < arr[i]) {
weight = arr[i];
cout << "当前最重小猪:" << weight << endl;
}
}
cout << "最重小猪:" << weight << endl;
system("pause");
}
执行效果:
2、数组元素逆置
案例描述:
请声明一个5个元素的数组,并且将元素逆置.
(如原数组元素为:1,3,2,5,4;逆置后输出结果为:4,5,2,3,1);
代码示例:
int main() {
int arr[5] = { 1,2,3,4,5 };
int tmp = 0;
int length = sizeof(arr) / sizeof(arr[0]);
//打印逆置前
cout << "逆置前:";
for (int j = 0; j < length;j++) {
cout << arr[j]<<" ";
}
cout << "\n";
//逆置
for (int i = 0;i<(length / 2);i++) {
tmp = arr[i];
arr[i] = arr[length - i-1];
arr[length - i-1] = tmp;
}
//打印逆置后
cout << "逆置后:";
for (int k = 0; k < length; k++) {
cout << arr[k] << " ";
}
cout << "\n";
system("pause");
return 0;
}
执行效果:
(3)、冒泡排序
作用:最常用的排序算法,对数组内元素进行排序
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。
3、重复以上的步骤,每次比较次数-1,直到不需要比较
示例: 将数组 { 4,2,8,0,5,7,1,3,9 } 进行升序排序
代码示例:
int main() {
//40/4 = 10
int arr[] = { 4,2,8,0,5,7,1,3,9 };
int length = sizeof(arr) / sizeof(0);
int tmp = 0;
//排序前
cout << "排序前";
for (int k = 0; k < length; k++) {
cout << arr[k];
}
cout << "\n";
//排序
for (int j = 0; j < length;j++) {
for (int i = 0; i < length-1; i++) {
if (arr[i] > arr[i + 1]) {
tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
}
}
}
//排序后
cout << "排序后";
for (int k = 0; k < length;k++) {
cout << arr[k];
}
cout << "\n";
system("pause");
return 0;
}
执行效果:
3、二维数组
(1)、二维数组的四种定义方式:
1、
数据类型 数组名 [行数][列数];
2、
数据类型 数组名 [行数][列数] = {{数据1 ,数据2},{数据3,数据4}};
3、
数据类型 数组名 [行数][列数] = {数据1,数据2,数据3,数据4};
4、
数据类型 数组名 [ ][列数] = {数据1,数据2,数据3,数据4};
建议:以上四种方式,第二种最直观,提高代码的可读性
示例:
(2)、二维数组数组名
作用:
1、查看二维数组所在空间
2、获取二维数组的首地址
示例:
总结:
1、二维数组名就是这个数组的首地址
2:对二维数组名进行sizeof时,可以获取整个二维数组占用的内存空间大小
3、二维数组可以看成是两个一维数组嵌套
二、函数
1、概述
作用:将一段经常使用的代码封装起来,减少重复的代码
一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能
2、函数的定义
函数的定义一般主要有5个步骤:
1、返回值类型
2、函数名
3、参数列表
4、函数体语句
5、return表达式
语法:
返回值的类型 函数名 (参数列表){
函数体语句
return 表达式
}
示例:
3、函数的调用
功能:使用定义好的函数
语法:函数名(参数)
示例:
4、值传递
所谓值传递,就是函数调用时,实参将数值传入给形参
值传递时,如果形参发生改变,并不会影响实参
5、函数的常见形式
常见的函数样式有四种
1、无参无反
2、有参无反
3、无参有反
4、有参有反
示例:
void test1() {
cout<<"这是无参无反函数"<<endl;
}
int test2() {
cout << "这是无参有反函数" << endl;
return 1;
}
void test3(int a) {
cout << "这是有参无反函数:"<<a << endl;
}
int test4(int x) {
cout << "这是有参有反函数:" <<x<< endl;
return x;
}
int main() {
//无参无反
test1();
//无参有反
test2();
//有参无反
int a = 10;
test3(10);
//有参有反
int x = 20;
test4(x);
}
6、函数的声明
作用:告诉编译器函数名称以及如何调用函数,函数的实际主体可以单独定义
语法:数据类型 函数名(参数列表);
注:函数的声明可以多次,但函数的定义只能有一次
示例:
7、函数的分文件编写
作用:让代码结构更加清晰
函数分文件编写一般分为4个步骤:
1、创建一个.h的头文件
2、创建后缀名为.cpp的源文件、
3、在头文件中写函数声明
4、在源文件中写函数的定义
示例:
三、指针
1、指针的基本概念
指针的作用:可以通过指针间接访问内存
注意事项:
1、内存编号是从0开始记录的,一般使用十六进制的数字表示
2、可以利用指针变量保存地址
2、指针变量的定义和使用
指针变量定义语法:数据类型* 指针变量名;
示例:
int main() {
//指针定义
int a = 10;
int* p = &a;
cout << "a的地址:" << &a << endl;
cout << "p的地址:" << p << endl;
//指针使用
cout << "存放在p地址的值:" << *p << endl;
}
3、指针所占的内存空间
提问:指针也是一种数据类型,那么这种数据类型占用多少内存空间?
答:在32位操作系统,占用4个字节,64位,占8个字节
示例:
4、空指针和野指针
空指针:指针变量指向的内存是编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
示例:
野指针:指针变量指向一个非法的内存空间(指向未知内存空间)
示例:
5、const修饰指针
const修饰指针有三种情况:
1、Const修饰指针 --常量指针(指向常量的指针)
2、Const修饰常量 --指针常量(指针是常量)
3、Const即修饰指针,有修饰常量(指针和值都不可修改)
6、指针和数组
作用:利用指针访问数组中的元素
示例:
//指针和数组
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
int* p = arr;
for (int i = 0; i < 10;i++) {
cout << "第" << i << "个数组元素的值是:" << *p<<endl;
p++;
}
}
7、指针和函数
作用:利用指针做函数参数,可以修改实参的值,即地址传值
示例:
void swap(int* a,int* b) {
int temp = 0;
temp = *a;
*a = *b;
*b = temp;
}
//指针和函数
int main() {
//地址传值
int a = 10;
int b = 20;
cout <<"调用前" <<a << " " << b<<endl;
swap(&a,&b);
cout << "调用后" << a<<" " << b;
}
四、结构体
1、结构体的基本概念
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
2、结构体的定义和使用
语法:struct 结构体名{结构体成员列表};
通过结构体创建变量的方式有三种:
1、struct 结构体名 变量名
2、struct 结构体名 变量名 = {成员1值,成员2值......}
3、定义结构体的时候顺便创建变量
示例:
int main() {
//三种变量定义方式
//1、
struct student s1;
s1.name = "zhangsan";
s1.age = 18;
s1.score = 100;
cout << "学生:" << s1.age << "年龄:" << s1.age << "成绩:" << s1.score << endl;
//2、
student s2 = { "lisi",19,101 };
cout << "学生:" << s2.age << "年龄:" << s2.age << "成绩:" << s2.score << endl;
//3、
s3.name = "laoliu";
s3.age = 20;
s3.score = 102;
cout << "学生:" << s3.age << "年龄:" << s3.age << "成绩:" << s3.score << endl;
system("pause");
return 0;
}
注意:
在C++中,创建变量时,struct关键字可以省略
3、结构体数组
作用:将自定义的结构体放入到数组中,方便维护
语法:struct 结构体名 数组名[元素个数] = { {} ,{}...}
示例:
4、结构体指针
作用:通过指针访问结构体中的成员
利用操作符->,可以通过结构体指针访问结构体属性
语法:指针名->属性
示例:
5、结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体
例如:每一个老师辅导学员,一个老师的结构体中,记录一个学生的结构体
示例:
6、结构体做函数参数
作用:将结构体作为参数向函数传递
传递方式有两种:
1、值传递
2、地址传递
示例:
7、结构体中const使用场景
作用:用const来防止误操作(常量指针)
示例: