文章目录
- C++初识
- 编写hello world
- 注释
- 变量
- 常量
- 定义常量的两种方式
- 关键字
- 标识符命名规则
- 数据类型
- 整形
- sizeof关键字
- 实型(浮点型)
- 字符型
- 转义字符
- 字符串型
- 布尔类型
- 数据的输入
- 运算符
- 程序流程结构
- 顺序结构
- 选择结构
- 三种形式
- 三目运算符
- switch语句
- 循环结构
- while循环语句
- do...while循环语句
- for循环语句
- 跳转语句
- break语句
- continue语句
- goto语句
- 数组
- 一维数组
- 一维数组定义方式
- 二维数组定义方式
- 数组名的用途
- 函数
- 定义
- 函数的声明
- 函数的分文件编写
- 指针
- 空指针和野指针
- 空指针
- 野指针
- const修饰指针
- 结构体
- 结构体定义使用
- 结构体数组
- 结构体指针
- 结构体嵌套结构体
- 结构体做函数参数
C++初识
编写hello world
# include <iostream>using namespace std;int main() {cout << "hello world" << endl;return 0;
}
注释
- 单行注释:
//注释内容
- 多行注释:
/*注释内容*/
变量
-
作用:给一段指定的内存空间取名,方便操作这段内存
-
语法:
类型 变量名 = 初始值;
常量
- 用于记录程序中不可更改的数据
定义常量的两种方式
-
#define宏常量
:#define 常量名 常量值
,通常在文件上方定义,表示一个常量 -
const修饰的常量:
const 数据类型 常量名 = 常量值
,通常在变量定义之前加const,修饰该变量为常量,不可更改
关键字
- 关键字是C++预先保留的字符,在定义变量或者常量时不要使用
标识符命名规则
-
标识符不能是关键字
-
只能由字母、数字、下划线组成
-
第一个字符必须是字母或者下划线
-
标识符中字母区分大小写
数据类型
- C++规定在创建一个变量或者常量的时,必须要指定出相应的数据类型,否则无法给变量分配内存
- 存在意义:给变量分配合适的内存空间
整形
-
作用:整形表示的是整数的数据类型
-
c++能够表示整形的类型有以下几种方式,区别在于所占内存空间的不同
数据类型 | 占用空间 | 取值范围 |
---|---|---|
short(短整型) | 2字节 | -215~215-1 |
int(整形) | 4字节 | -231~231-1 |
long(长整形) | windows为4字节,Linux32位为4字节,64位为8字节 | -231~231-1 |
long long(长长整型) | 8字节 | -263~263-1 |
sizeof关键字
- sizeof关键字可以统计数据类型所占内存大小
- 语法:
sizeof(数据类型/变量 )
- 演示
#include <iostream>using namespace std;int main() {short a = 10;cout << "short 类型所占内存空间为" << sizeof(a) << endl;cout << "int 类型所占内存空间为" << sizeof(int) << endl;cout << "long 类型所占内存空间为" << sizeof(long) << endl;cout << "long long 类型所占内存空间为" << sizeof(long long) << endl;return 0;
}
实型(浮点型)
- 小数默认的是
double
类型,可以在float类型的小数值后面直接加一个f,减少一次double到float的强制类型转换float f = 3.14f;
数据类型 | 占用空间 | 有效数字范围 |
---|---|---|
float | 4字节 | 7位有效数字 |
double | 8字节 | 15~16位有效数字 |
- 科学计数法表示小数
#include <iostream>using namespace std;int main() {float f1 = 3.14f;cout << "folat 值" << f1 << " float 占用空间大小" << sizeof(f1) << endl;double d1 = 3.1415926;cout << "double 值" << d1 << " double 占用空间大小" << sizeof(d1) << endl;// 科学计数法float e1 = 3.14e4; // 3.14 * 10^4float e2 = 3.14e-4; // 3.14 * 0.1^4cout << "科学计数法e1值" << e1 << endl;cout << "科学计数法e2值" << e2 << endl;return 0;
}
字符型
-
字符型变量用于显示单个字符,单个字符使用单引号包裹
-
语法:
char 变量名 = '变量值';
-
c和c++中变量只占1个字节
-
字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元
转义字符
- 作用:用于表示一些不能显示出来的ASCII字符
字符串型
-
作用:用于表示一串字符,字符串使用双引号包裹
-
两种风格
-
c风格字符串:
char str[] = "hello";
-
c++风格字符串:
string 变量名 = 字符串值;
,需要包含头文件#include <string>
-
#include <iostream>
#include <string>using namespace std;int main() {char str[] = "hello";cout << str << endl;string str1 = "world";cout << str1 << endl;return 0;
}
布尔类型
-
布尔类型代表真或者假的值
-
布尔类型只有两个值:true或者false
-
布尔类型占1个字节大小
数据的输入
-
作用:用于从键盘获取数据
-
关键词:
cin
-
语法:
cin >> 变量
# include <iostream>using namespace std;int main() {int a;cin >> a;cout << "收到的输入a的值是:" << a << endl;return 0;
}
运算符
-
作用:用于执行代码的计算
-
分类
运算符类型 | 作用 |
---|---|
算术运算符 | 处理四则运算 |
赋值运算符 | 将表达式的值赋值给变量 |
比较运算符 | 用于表达式的比较,并返回一个真值或假值 |
逻辑运算符 | 用于根据表达式的值返回真值或假值 |
程序流程结构
顺序结构
- 程序按顺序执行,不发生跳转
选择结构
- 根据是否满足条件,有选择的执行相应的功能
三种形式
-
单分支
if
-
多行格式
if...else..
-
多条件
if...elseif...else
三目运算符
- 语法:
表达式1?表达式2:表达式3
,如果表达式1为真执行表达式2,否则执行表达式3
switch语句
-
作用:执行多条件分支语句
-
语法
switch(表达式){case 结果1: 执行语句;break;case 结果1: 执行语句;break;... ...default: 执行语句;break;
}
循环结构
- 根据是否满足条件,循环多次的执行某段代码
while循环语句
- 语法:
while(循环条件){循环语句}
,只要条件为真,就执行循环语句
do…while循环语句
- 语法:
do {循环语句} while(循环条件)
- 与while循环的区别是先执行一次循环语句,在判断条件是否成立
for循环语句
- 语法:
for(初始表达式;条件表达式;变量变化表达式){循环语句}
跳转语句
break语句
-
作用:用于跳出选择结构或者循环结构
-
使用时机
-
出现在switch条件语句中,作用是终止case并跳出switch
-
出现在循环语句中,作用是跳出当前循环语句
-
出现在嵌套循环中,作用是跳出离它最近的一层训话
-
continue语句
- 作用:在循环语句中,跳过本次循环中余下尚未执行的代码,继续执行下一次循环
goto语句
-
语法:
goto 标记;
-
如果标记名称存在,执行到goto语句时,会跳转到标记的位置
#include <iostream>
using namespace std;
int main(){cout << 1<< endl;goto LABEL;cout << 2<< endl;cout << 3<< endl;LABEL:return 0;
}
数组
-
数组就是一个集合,里面存放着相同类型的数据元素
-
数组名的命名规范和变量名命名规范一致
-
特点:
-
数组中每个元素都是相同的数据类型
-
数组是由连续的内存位置组成的
-
数组元素下标是从0开始的
-
一维数组
一维数组定义方式
// 数据类型 数组名[数组长度];int arr1[10];// 数据类型 数组名[数组长度] = {值列表}int arr2[3] = {1, 2, 3} ;// 数据类型 数组名[] = {值列表}int arr3[] = {3, 4};
二维数组定义方式
数组类型 数组名[行数][列数];
数组类型 数组名[行数][列数]={{数据1,数据2},{数据3,数据4}};
数组类型 数组名[行数][列数]={数据1,数据2,数据3,数据4};
数组类型 数组名[][列数]={数据1,数据2,数据3,数据4};
数组名的用途
- 可以统计整个数组在内存中的长度:
sizeof(数组名)
- 可以获取数组在内存中的首地址
函数
定义
返回值类型 函数名 (参数列表)
{函数体;return 返回值;
}
函数的声明
-
作用:告诉编译器函数名称及如何调用函数,函数的实际主体可以单独定义
-
函数的声明可以有多次,单函数的定义只能有一次
函数的分文件编写
- 创建后缀为
.h
的头文件 - 创建后缀为
.cpp
的源文件 - 在头文件中写函数的声明
- 在源文件中写函数的定义
指针
- 不管是什么数据类型,32位操作系统下指针占4字节,64位操作系统下指针占8字节
空指针和野指针
空指针
-
指针变量只想内存中编号为0的空间
-
用途:初始化指针变量
int * p = NULL;
-
注意:空指针指向的内存是不可以访问的,0~255之间的内存编号是系统占用的,因此不可以访问
野指针
- 指针变量指向非法的内存空间
const修饰指针
- 常量指针:const修饰指针,指针的指向可以修改,但是指针指向的值不可以修改
int a = 10;
const int * p = &a;
- 指针常量:const修饰常量,指针的指向不可以修改,但是指针指向的值可以修改
int a = 10;
int * const p = &a;
- const即修饰指针又修饰常量,既不可以修改指针的指向,也不可以修改指针指向的值
int a = 10;
const int * const p = &a;
结构体
结构体定义使用
-
结构体类型属于用户自定义类型,允许用户存储不同的数据类型
-
语法:
struct 结构体名 {// 成员变量
}
- 通过结构体创建变量
struct Student stu1;// 创建结构体变量时struct关键字可以省略Student stu2 = {name:"zs", age:18};struct Student stu3 = {"lisi", 20};// 结构体变量利用"."访问成员cout << stu1.name << " " << stu1.age << endl;
结构体数组
// 创建结构体数组Student stus[2] = {{name:"zhangsan", age:10},{name:"wangwu", age:78}};// 给结构体中的元素赋值cout << "修改前的值:" + stus[1].name << endl;stus[1].name = "zsx";cout << "修改后的值:" + stus[1].name << endl;// 遍历结构体数组for (int i = 0; i < sizeof(stus) / sizeof(Student); i++) {cout << "姓名:" << stus[i].name << " 年龄: " << stus[i].age << endl;}
结构体指针
-
通过指针访问结构体中的成员
-
使用
->
运算符可以通过结构体指针访问结构体中的属性
Student *pstu = &stu2;cout << "修改前-》姓名:" << pstu->name << " 年龄: " << pstu->age << endl;pstu->name = "aaa";cout << "修改后-》姓名:" << pstu->name << " 年龄: " << pstu->age << endl;
结构体嵌套结构体
// 定义结构体
struct Student {string name;int age;
};struct Teacher {string name;int age;Student stu;
};// 结构体嵌套
Teacher tea = {name: "canglaoshi",age: 40,stu:{name: "xiaocang",age: 18,},
};
cout << "老师信息:名字->" << tea.name << " 年龄-> " << tea.age << " 老师的学生信息: 学生名字-> " << tea.stu.name<< " 学生年龄-> " << tea.stu.age << endl;
结构体做函数参数
- 值传递不会修改主函数中的值
- 指针传递会修改函数中的值,使用指针可以避免在结构体特别大时,值传递浪费大量空间
// 值传递
void printStudentInfo1(Student stu) {cout << "姓名:" << stu.name << "年龄:" << stu.age << endl;
}// 指针传递
void printStudentInfo2(Student *stu) {cout << "姓名:" << stu->name << "年龄:" << stu->age << endl;
}
// const指针传递
void printStudentInfo2(const Student *stu) {// stu.name = "zhangsan" 因为是const所以不能进行该操作cout << "姓名:" << stu->name << "年龄:" << stu->age << endl;
}