本笔记主要来源于教程https://www.bilibili.com/video/av41559729?p=1
5 数组
5.1 概述
所谓数组,就是一个集合,里面存放了相同类型的数据元素。
特点1:数组中的每个数据元素都是相同的数据类型。
特点2:数组是由连续的内存位置组成的。
5.2 一维数组
5.2.1 一维数组定义方式
1.数据类型 数组名[数组长度]
2.数据类型 数组名[数组长度]={值1,值2…};
//如果在初始化数据时候,没有全部填写完,会用0来填补剩余的数据。
3.数据类型 数组名[]={值1.值2…};
//定义数组时,必须要有初始长度(指{}内至少要有一个数据)
数组元素的下标是从0开始索引的。
5.2.2 一维数组数组名
一维数组名称的用途:
- 可以统计整个数组在内存中的长度。
- 可以获取数组在内存中的首地址。
#include< iostream>
using namespace std;
int main()
{
//数组用途
//1. 可以统计整个数组在内存中的长度。
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "整个数组占用内存空间为 :" << sizeof(arr) << endl;
cout << "每个元素所占用的内存空间为: " << sizeof(arr[0]) << endl;
cout << "数组中元素的个数为: " << sizeof(arr) / sizeof(arr[0]) << endl;
//2. 可以获取数组在内存中的首地址。
cout << "数组首地址为: " << arr << endl;//16进制
cout << "数组首地址为: " << (int)arr << endl;//强转成十进制
cout << "数组中第一个元素的地址为: " << (int)&arr[0] << endl;
cout << "数组中第二个元素的地址为: " << (int)&arr[1] << endl;//与第一个紧挨着,只差四个字节。
//数组名是常量,不可以进行赋值的操作。
//arr = 100;报错
system("pause");
return 0;
}
数组名是常量,不可以进行赋值的操作。
练习案例:元素逆置
#include< iostream>
using namespace std;
int main()
{
//实现数组元素逆置
//1.创建数组
int arr[5] = { 1,3,2,5,4 };
cout << "元素数组逆置前:" << endl;
for (int i = 0; i < 5; i++)
cout << arr[i] << endl;
//2.实现逆置
//2.1记录起始下标的位置
//2.2记录结束下标的位置
//2.3起始下标与结束小标的元素互换
//2.4起始位置++,结束位置--
//2.5循环执行2.1操作,直到起始位置>=结束位置
int start = 0;//起始下标
int end = sizeof(arr) / sizeof(arr[0]) - 1;//结束下标
while (start < end) //重要:停止条件,自己之前没有想到。
{
//交换代码
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
//下标更新
start++;
end--;
}
//3.打印逆置后的数组
cout << "数组元素逆置后:" << endl;
for (int i = 0; i < 5; i++)
cout << arr[i] << endl;
system("pause");
return 0;
}
停止条件注意
5.2.3 冒泡排序
作用:最常用的排序方法,对数组内元素进行排序。
- 比较相邻的元素,如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。
- 重复以上的步骤,每次比较次数-1,直到不需要比较。
示例:将数组{4,2,8,0,5,7,1,3,9}进行升序排序
#include< iostream>
using namespace std;
int main()
{
//利用冒泡排序实现升序序列。
int arr[9] = { 4,2,8,0,5,7,1,3,9 };
cout << "排序前: " << endl;
for (int i = 0; i < 9; i++)
{
cout << arr[i] << " ";
}
cout << endl;
//开始冒泡排序
//总共排序轮数为 元素个数-1
for (int i = 0; i < 9 - 1; i++)
{
//内层循环对比 次数=元素个数-当前轮数 -1
for (int j = 0; j < 9 - i - 1; j++)
{
//如果第一个数字比第二个数字大,交换两个数字
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
//排序后结果
cout << "排序后: " << endl;
for (int i = 0; i < 9; i++)
{
cout << arr[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
注意总共排序轮数为 元素个数-1,而内层循环对比次数=元素个数-当前轮数 -1
5.3 二维数组
二维数组就是在一维数组上,多加一个维度。
5.3.1 二维数组定义方式
二维数组定义的四种方式:
数据类型 数组名[行数][列数]
数据类型 数组名[行数][列数]={{数据1,数据2},{数据3,数据4}}
数据类型 数组名[行数][列数]={数据1,数据2,数据3,数据4}
数据类型 数组名[][列数]={数据1,数据2,数据3,数据4}
建议:以上4种定义方式,第二种更加直观,提高代码的可读性。
5.3.2 二维数组数组名
用途:
- 查看二位数组所占内存空间。
- 获取二维数组首地址。
示例
#include< iostream>
using namespace std;
int main()
{
//二维数组数组名
int arr[2][3] =
{
{1,2,3},
{4,5,6}
};
cout << "二维数组大小: " << sizeof(arr) << endl;
cout << "二维数组一行大小: " << sizeof(arr[0]) << endl;
cout << "二维数组元素大小: " << sizeof(arr[0][0]) << endl;
cout << "二维数组行数: " << sizeof(arr) / sizeof(arr[0]) << endl;
cout << "二维数组列数: " << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;
//地址
cout << "二维数组首地址" << (int) arr << endl;
cout << "二维数组第一行地址" << arr[0] << endl;
cout << "二维数组第二行地址" << arr[1] << endl;
cout << "二维数组第一个元素地址" <<(int) &arr[0][0] << endl;
cout << "二维数组第二个元素地址" << &arr[0][1] << endl;
system("pause");
return 0;
}
6 函数
6.1 概述
作用:将一段经常使用的代码封装起来,减少重复代码
一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。
6.2 函数的定义
函数的定义一般主要有5个步骤:
- 返回值类型
- 函数名
- 参数列表
- 函数体语句
- return表达式
语法:
返回值类型 函数名 (参数列表)
{
函数体语句
return表达式
}
//函数的定义
//语法:
//返回值类型 函数名(参数列表) {函数体语句 return表达式}
//加法函数,实现两个整型相加,并将相加结果返回
int add(int num1, int num2)
{
int sum = num1 + num2;
return sum;
}
6.3 函数的调用
功能:使用定义好的函数。
语法:函数名(参数)
#include< iostream>
using namespace std;
//定义加法函数
//函数定义时,num1和num2并没有实际数据
//只是形式上的参数,简称形参
int add(int num1, int num2)
{
int sum = num1 + num2;
return sum;
}
int main()
{
//main函数中调用add函数
int a = 10;
int b = 20;
//函数调用语法:函数名(参数)定义时没有参数就不用填写
//a和b称为实际参数,简称实参
//当调用函数时,实参的值会传递给形参
int c = add(a, b);
cout << "c= " << c << endl;
system("pause");
return 0;
}
6.4 值传递
- 所谓值传递,就是函数调用时实参将数值传入给形参
- 值传递时,如果形参发生变化,并不会影响实参
#include< iostream>
using namespace std;
//值传递
//定义函数,实现两个数字进行交换函数
//如果函数不需要返回值,声明时可以写void
void swap(int num1, int num2)
{
cout << "交换前: " << endl;
cout << "num1= " << num1 << endl;
cout << "num2= " << num2 << endl;
int temp = num1;
num1 = num2;
num2 = temp;
cout << "交换后: " << endl;
cout << "num1= " << num1 << endl;
cout << "num2= " << num2 << endl;
//return;返回值不需要时,可以不写reurn
}
int main()
{
int a = 10, b = 20;
cout << "a= " << a << endl;
cout << "b= " << b << endl;
//当我们做值传递时,函数的形参发生变化,并不会影响实参
swap(a, b);
cout << "a= " << a << endl;
cout << "b= " << b << endl;//a和b并没有发生变化
system("pause");
return 0;
}
6.5 函数的常见形式
常见的函数形式有4种:
- 无参无返
- 有参无返
- 无参有返
- 有参有返
6.6 函数的声明
作用:告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义
函数的 声明可以多次,但函数的 定义只能有一次
#include
using namespace std;
//函数的声明
//比较函数,实现两个整型数字进行比较,返回较大的值
//提前告诉编译器函数的存在,可以利用函数的声明
//函数的声明
//声明可以写多次,但是定义只能有一次
int max(int a, int b);
int max(int a, int b);
int max(int a, int b);
int max(int a, int b);
int main()
{
int a = 10;
int b = 20;
cout << max(a, b) << endl;
system("pause");
return 0;
}
//定义
int max(int a, int b)
{
return a > b ? a : b;
}
6.7 函数的分文件编写
作用:让代码的结构更加清晰。
函数分文件编写一般有四个步骤:
- 创建后缀名为.h的头文件
- 创建后缀名为.cpp的源文件。
- 在头文件中写函数的声明。
- 在源文件中写函数的定义。
头文件swap.h
#include< iostream>
using namespace std;
//函数的声明
void swap(int a, int b);
源文件swap.cpp
#include"swap.h"
//函数的定义
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "a= " << a << endl;
cout << "b= " << b << endl;
}
程序
#include
using namespace std;
#include"swap.h"
//1. 创建后缀名为.h的头文件
//2. 创建后缀名为.cpp的源文件。
//3. 在头文件中写函数的声明。
//4. 在源文件中写函数的定义。
int main()
{
int a = 10;
int b = 20;
swap(a, b);
system("pause");
return 0;
}
最后欢迎大家访问我的个人博客青蛙听禅的博客
转载:https://blog.csdn.net/qq_40694605/article/details/104536537
查看评论