C++学习笔记(二)(数组,函数)

本笔记主要来源于教程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 一维数组数组名

一维数组名称的用途:

  1. 可以统计整个数组在内存中的长度。
  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. 比较相邻的元素,如果第一个比第二个大,就交换他们两个。
  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. 数据类型 数组名[行数][列数]={{数据1,数据2},{数据3,数据4}}
  3. 数据类型 数组名[行数][列数]={数据1,数据2,数据3,数据4}
  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个步骤:

  1. 返回值类型
  2. 函数名
  3. 参数列表
  4. 函数体语句
  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种:

  1. 无参无返
  2. 有参无返
  3. 无参有返
  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 函数的分文件编写

作用:让代码的结构更加清晰。
函数分文件编写一般有四个步骤:

  1. 创建后缀名为.h的头文件
  2. 创建后缀名为.cpp的源文件。
  3. 在头文件中写函数的声明。
  4. 在源文件中写函数的定义。

头文件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;
}




 
最后欢迎大家访问我的个人博客青蛙听禅的博客

发布了4 篇原创文章 · 获赞 0 · 访问量 28

猜你喜欢

转载自blog.csdn.net/qq_40694605/article/details/104536537