学习b站黑马程序员C++课程记录
数组
是一个集合,里面包含相同类型的元素
连续的内存空间
语法:定义的三种方式
1.数据类型 数组名[数组长度];
2.数据类型 数组名[数组长度] = {值1,值2…};
3.数据类型 数组名[] = {值1,值2…}
C++数组从0开始索引
数组名用途
1.统计整个数组在内存中的长度 sizeof(arr)
2.可以获取数组在内存中的首地址
二维数组
在一维数组基础上增加了一个维度
语法:定义的四种方式
1.数据类型 数组名[行数][列数];
2.数据类型 数组名[行数][列数] = {{数据1,数据2},{数据3,数据4}};
3.数据类型 数组名[行数][列数] = {数据1,数据2,数据3,数据4};
4.数据类型 数组名[][列数] = {数据1,数据2,数据3,数据4};
二维数组名
1.查看二维数组所占内存空间
2.可以查看二维数组的首地址
函数
作用:将经常使用的代码封装起来,减少重复代码
语法:
返回值类型 函数名(参数列表)
{
函数体语句
return 表达式
}
函数的调用
语法:函数名(参数)
实参:实际参数(有真实数据的参数)
形参:形式参数(形式上的参数)
值传递
输出:
a=10 b=20
num1=10 num2=20
num1=20 num2=10
a=10 b=20
原因如图所示:
函数的声明
告诉编译器不要因为没有看见max函数的完整定义就报错
声明可以写多次,但是定义只能有一次
函数的分文件编写
让代码的结构更加清晰
函数分文件编写一般有四个步骤
1.创建后缀为.h的头文件
2.创建后缀为.cpp的源文件
3.头文件中写函数的声明
4.在源文件中写函数的定义
首先创建swap.h头文件
#include<iostream>
using namespace std;
void swap(int a, int b)
接着创建swap.cpp源文件
#include"swap.h" //双引号代表是自己写的头文件,并且告诉编译器这个源文件swap.cpp和头文件swap.h是配套的
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "a = " << a << endl
cout << "b = " << b << endl
}
然后在新的一个cpp文件中再包含一次#include "swap.h"就可以直接使用swap函数了
指针
作用:通过指针间接访问内存
指针就是一个地址
定义语法:数据类型 * 指针变量
int a = 10;
int * p;
p = &a;//取地址符 int * p = &a
cout << "a的地址为:" << &a << endl
cout << "指针p为:" << p << endl;
//可以通过解引用方式找到指针指向的内存
//指针前加*代表解引用,找到指针指向的内存中的数据
*p = 1000;
cout << "a = " << a << endl;
cout << "*p = " << *p << endl;
指针所占的内存空间
32位操作系统下,占用4个字节
654位操作系统下,占用8个字节
空指针和野指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
空指针不能访问
int * P = NULL;
野指针:指针变量指向非法的内存空间
int * p = (int *)0x1100;
cout << *p << endl;
空指针和野指针都不是我们申请的空间,因此不要随意访问!!!
const修饰指针
const修饰指针的三种情况:
1.const修饰指针 --常量指针
2.const修饰常量 --指针常量
3.const既修饰指针,又修饰常量
常量指针
指针常量
const既修饰指针,又修饰常量
指针和数组
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
cout << "第一个元素为:" << arr[0] << endl;
int * p = arr; //arr即数组首地址
cout << ”利用指针访问第一个元素“ << *p << endl;
p++; //让指针向后偏移4个字节
cout << ”利用指针访问第二个元素“ << *p << endl;
输出的值即为arr[0],arr[0],arr[1]对应的值
指针和函数
void swap02(int *p1, int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int a = 10;
int b = 20;
//地址传递
swap02(&a, &b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
可以从输出中看见a与b的值发生了交换,原本的值传递中形参无法改变实参的值
结构体
用户自定义的数据类型
定义语法:struct 类型名称{成员列表 }
使用:
1.struct Student s1
2.struct Student s2 = {…}
3.在定义结构体时顺便创建结构体变量
struct Student
{
string name; //注意包含string头文件
int age;
int score;
}s3;
int main()
{
struct Student s1;
s1.name = "张三";
s1.age = 18;
s1.score = 100;
cout << "姓名:" << s1.name << "年龄:" << s1.age << "分数:" << s1.score << endl;
struct Student s2 = {”李四“, 19, 60};
cout << "姓名:" << s2.name << "年龄:" << s2.age << "分数:" << s2.score << endl;
s3.name = "张三";
s3.age = 18;
s3.score = 80;
cout << "姓名:" << s3.name << "年龄:" << s3.age << "分数:" << s3.score << endl;
}
1.创建结构体变量时类型关键字struct可以省略
2.创建结构体变量时,关键字struct可以省略
3.结构体变量利用操作符”.“访问成员
结构体数组
作用:将自定义结构体放入数组中方便维护
语法:struct 结构提名 数组名[元素个数] = {{},{},{},…}
结构体指针
//创建结构体变量
student s = {”张三“, 18, 100};
//通过指针指向结构体变量
student * p = &s;
//通过指针访问机构提变量中的饿数据
cout << "姓名:" << p->name << "年龄" << p->age << "分数:" << p->score << endl;