C++ 基础篇

变量

  • 变量存在的意义:方便我们管理内存空间

常量

  1. #define 宏常量 :#define 常量名 常量值
  • 通常在文件上方定义,表示一个常量
  1. const修饰的变量 : const 数据类型 变量名 = 常量值
  • 通常在变量定义前加关键字 const ,修饰该变量为常量,不可修改

关键字

  • C++预先保留的单词(标识符)

  • 在定义变量的时候不要使用关键字

SIZEOF关键字

利用sizeof关键字可以统计数据类型所占内存的大小

sizeof(数据类型/变量)

标识符命名规则

  • 标识符不能是关键字
  • 标识符只能是字母、数字、下划线组成
  • 第一个字符必须为字母或下划线
  • 标识符中字母区分大小写

建议:给标识符命名时,争取做到见名知意,方便自己和他人阅读

数据类型

整型

短整型

short num1 = 10;

整型

int num2 = 10;

长整型

long num3 = 10;

长长整型

long long num4 = 10;

浮点型

用于表示小数

小数一般默认双精度

单精度

float f1 = 3.14f;

双精度

double d1 = 3.14;

示例:

    //默认情况下 输入一个小数 会显示6位有效数字

	// 单精度
	float f1 = 3.1415926535f;
	cout << f1 << endl;

	// 双精度
	double d1 = 3.1415926535;
	cout << f1 << endl;

	// 统计占用空间
	cout << "float占有内存空间:" << sizeof(float) << endl;	//4
	cout << "double占有内存空间:" << sizeof(double) << endl;	//8

	// 科学计数法
	float f2 = 3e2;
	cout << f2 << endl; //300
	float f3 = 3e-2;
	cout << f3 << endl; //0.03

字符型

字符型变量用于显示单个字符

C/C++中字符型变量值占用1个字节

字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元

示例:

	// 创建方式
	char ch = 'a';
	cout << ch << endl;

	//内存大小
	cout << sizeof(char) << endl;

	//常见错误
	//char  ch1 = "b"; //创建字符型变量不能使用双引号
	//char ch1 = 'abcdef';//创建字符型变量只能有一个字符

	//对应ASCII编码
	cout << (int)ch << endl;//a = 97,b = 98

转义字符

用于表示一些不能显示出来的ASCII字符

示例:

	//转义字符

	//换行 \n
	cout << "qwer\n";

	//反斜杠 \\

	cout << "\\" << endl;

	//水平制表 \t  8个位置
	cout << "qwe\trttyuui" << endl;
	cout << "qwert\ttyuui" << endl;
	cout << "q\twerttyuui" << endl;

输出结果:

//水平制表 对齐效果
/*
* qwe     rttyuui
  qwert   tyuui
  q       werttyuui
*/

字符串型

用于表示一串字符

  1. C风格字符串 char 变量名[] = “字符串”;
char ch1[] = "hello word";
  1. C++风格 string 变量名 = “字符串” ;
string ch2 = "helloworld";

布尔类型

布尔数据代表真或假的值

非零即真

示例:

	bool flag = true;
	cout << flag << endl; //1

	flag = false;
	cout << flag << endl; //0

	cout << sizeof(bool) << endl;//1

数据输入

用于从键盘获取数据

关键字 : cin

cin >> 变量;

示例:

	//整型
	int a = 0;
	cout << "请给整型变量a赋值" << endl;
	cin >> a;

	//浮点型
	double b = 3.14;
	cout << "请给浮点型变量b赋值" << endl;
	cin >> b;


	//字符型
	char c = 'c';
	cout << "请给字符型变量c赋值" << endl;
	cin >> c;

	//字符串型
	string d = "qwer";
	cout << "请给字符串型变量d赋值" << endl;
	cin >> d;

	//布尔类型
	bool e = true;
	cout << "请给布尔类型变量e赋值" << endl;
	cin >> e;

	cout << a << b << c << d  <<  e << endl;

运算符

详细描述请参看C语言学习笔记

只有整型变量才可以进行取模(%)运算

流程控制结构

C/C++支持最基本的三种运行结构:顺序结构选择结构循环结构

  • 顺序结构:程序按顺序执行,不发生跳转
  • 选择结构:依据条件是否满足,有选择的执行相应的功能
  • 循环结构:依据条件是否满足,循环多次执行某段代码

详细描述请参看C语言学习笔记

数组

数组名的用途

  1. 可以统计整个数组在内存中的长度 sizeof(数组名)
  2. 可以获取数组在内存中的首地址

数组名是一个常量,不可进行赋值操作

示例:

	int arr[] = { 1,23,3,4,7,5,7 };
	cout << "整个数组占用的空间:" << sizeof(arr) << endl;
	cout << "总个数:" <<  sizeof(arr) / sizeof(arr[0]) << endl;
	int i = 1;
	for (auto n : arr)
	{
		cout << "数组" << i++ << "内容:" << n << endl;
	}

	cout << "数组的首地址:" << arr << endl;

	int j = 0;
	for (auto a : arr)
	{
		cout << "数组第"<< j + 1 <<"个元素的首地址:" << (int)&arr[j] << endl;
		//默认十六进制,(int)转化十进制
		j++;
	}

输出结果:

/*
*整个数组占用的空间:28
*总个数:7
*数组1内容:1
*数组2内容:23
*数组3内容:3
*数组4内容:4
*数组5内容:7
*数组6内容:5
*数组7内容:7
*数组的首地址:000000B44190FAB8
*数组第1个元素的首地址:1100020408
*数组第2个元素的首地址:1100020412
*数组第3个元素的首地址:1100020416
*数组第4个元素的首地址:1100020420
*数组第5个元素的首地址:1100020424
*数组第6个元素的首地址:1100020428
*数组第7个元素的首地址:1100020432
*/

一维数组

一维数组的定义方式:

  1. 数据类型 数组名 [数组长度];
  2. 数据类型 数组名 [数组长度] = {值1,值2…};
  3. 数据类型 数组名 [] = {值1,值2…};

如果在初始化数据的时候,没有全部填写,会用0来填补剩余数据

示例:

	int arr[5];
	arr[0] = 0;
	arr[1] = 10;
	arr[2] = 20;
	arr[3] = 30;
	arr[4] = 40;

	for (int i = 0; i < 5; i++)
	{
		cout << arr[i] << endl;
	}

	int arr1[5] = { 1,2,3,4 };
	//如果在初始化数据的时候,没有全部填写,会用0来填补剩余数据

	int arr2[] = { 1,3,5,4};

二维数组

二维数组就是在一维数组上,多加了一个维度

一维数组的定义方式:

  1. 数据类型 数组名 [行数] [列数];
  2. 数据类型 数组名 [行数] [列数] = { {数据1,数据2},{数据3,数据4} };
  3. 数据类型 数组名 [行数] [列数] = { 数据1,数据2,数据3,数据4 … };
  4. 数据类型 数组名 [] [列数] = { 数据1,数据2,数据3,数据4 … };

建议使用第二种更加直观,有利于提高代码的可读性

示例:

int main()
{
	//定义方式
	
	//1. 数据类型 数组名[行数][列数];
	int arr[2][3];
	arr[0][0] = 1;
	arr[0][1] = 2;
	arr[0][2] = 3;
	arr[1][0] = 4;
	arr[1][1] = 5;
	arr[1][2] = 6;

	//外侧循环打印行数,内测循环打印列数
	for (rsize_t i = 0; i < 2; i++)
	{
		for (size_t j = 0; j < 3; j++)
		{
			cout << arr[i][j] << "\t";
			//  \t  制表符
		}
		cout << "\n";
	}

	//2. 数据类型 数组名[行数][列数] = { {数据1,数据2},{数据3,数据4} };
	int arr1[2][3] = { 
		{1,2,3},
		{4,5,6} 
	};

	//3. 数据类型 数组名[行数][列数] = { 数据1,数据2,数据3,数据4 ... };
	int arr2[2][3] = { 1,2,3,4,5,6 };//只要写了列数 , 代码可以自动识别列

	//4. 数据类型 数组名[][列数] = { 数据1,数据2,数据3,数据4 ... };
	int arr3[][3] = { 1,2,3,4,5,6 };//只要写了列数 , 代码可以自动识别列

	return 0;
}

输出结果:

//1       2       3
//4       5       6

排序

元素逆置

数组元素逆置示例:

	int arr[] = { 1,2,5,4,3 };

	int start = 0; // 起点元素的下标
	int end = sizeof(arr) / sizeof(arr[0]) - 1; //末尾元素的下标

	int f = sizeof(arr) / sizeof(arr[0]); //数组元素个数

	int temp = 0;//临时存储变量

	cout << "逆置前的结果:" << endl;
	for (size_t i = 0; i < f; i++)
	{
		cout << arr[i] << " ";
	}
	while (start < end)
	{
		int temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
		start++;
		end--;
	}
	
	cout << endl;
	cout << "逆置后的结果:" << endl;
	
	for (auto n : arr)
	{
		cout << n << " ";
	}

	/*
	逆置前的结果:
	1 2 5 4 3
	逆置后的结果:
	3 4 5 2 1
	*/

冒泡排序

冒泡排序示例:


	int arr[] = { 1,2,5,4,3 };

	int start = 0; // 起点元素的下标
	int end = sizeof(arr) / sizeof(arr[0]) - 1; //末尾元素的下标

	int f = sizeof(arr) / sizeof(arr[0]); //数组元素个数 f = 5

	int temp = 0;//临时存储变量

	for (int j = 0; j < (f - 1); j++)
	{
		for (int z = 0; z < (f - 1 - j) ; z++)
		{
			if (arr[z] > arr[z+1])
			{
				//arr[z] < arr[z+1]  换成 > 第一个数组元素 将 造成 数据溢出
				temp = arr[z];
				arr[z] = arr[z + 1];
				arr[z + 1] = temp;
			}
		}
	}
	cout << endl;
	cout << "排序后结果:" << endl;
	for (size_t x = 0; x < f; x++)
	{
		cout << arr[x] << " ";
	}
	return 0;

输出结果:

/*
排序前的结果:
1 2 5 4 3
排序后结果:
1 2 3 4 5
*/

函数

将一段经常使用的代码封装起开,减少重复代码

当我们做值传递的时候,函数的形参发生改变,并不影响实参

函数的定义

  1. 返回值类型
  2. 函数名
  3. 参数列表
  4. 函数体语句
  5. return 表达式

如果函数不需要返回值,声明的时候可以写*void

语法:

返回值类型 函数名 (参数列表)
{
	函数体语句
	return 表达式
}
int add(int num1, int  num2)
{
	int sum  = num1 + num2;
	return sum;
}

函数的常见样式

  1. 无参无返
  2. 有参无返
  3. 无参有返
  4. 有参有返

示例:

//1. 无参无返
void test01()
{
	cout << "this01" << endl;
}
//2. 有参无返
void test02(int a)
{
	cout << a << endl;
	return;
}
//3. 无参有返
int test03()
{
	return 1000;
}
//4. 有参有返
int test04(int a, int b)
{
	int sum = a + b;
	return sum;
}

函数的声明

告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。

如果函数在main函数前创建可以省略声明,反之,必须声明函数。

函数的声明可以有多次,但函数的定义只能有一次

示例:

//声明
int Max(int a, int b);
//定义
int Max(int a, int b)
{
	return a > b ? a : b;
}

函数的分文件编写

作用:让代码结构更清晰

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

指针

可以通过指针间接访问内存,进行读写操作

  • 内存编号从0开始记录的,一般用十六进制表示
  • 可以用指针变量保存地址

指针的定义和使用

语法:数据类型 * 指针变量名;

可以通过解引用的方法来找到指针指向的内存

指针前加 * 代表解引用,找到指针指向的内存中的数据

示例:

int main()
{
	//定义指针
	int a = 10;
	//语法:数据类型 * 指针变量名;
	int* p;
	//让指针记录变量a地址
	p = &a;
	// & 取地址符
	//打印变量a的首地址
	cout << &a << endl;	//0000006DD25AFB44
	//打印指针p的首地址
	cout << p << endl;	//
	
	//指针的使用
	//可以通过解引用的方法来找到指针指向的内存
	//指针前加 * 代表解引用,找到指针指向的内存中的数据
	*p = 1000;
	cout << a << endl;	//a = 1000
	cout << *p << endl;	//*p = 1000

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有事没事 敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值