C++基础入门
1 数据类型
C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存
1.1 整型
作用:整型变量表示的是整数类型的数据
C++中整数类型包括以下几种,区别在于所占内存空间不同:
数据类型 | 占用空间 | 取值范围 |
---|---|---|
short(短整型) | 2字节 | (-215~215-1) |
int(整型) | 4字节 | (-231~231-1) |
long(长整型) | windows为4字节,linux为4字节(32位),8字节(64位) | (-231~231-1) |
long long(长长整型) | 8字节 | (-263~263-1) |
2.2 sizeof关键字
作用:利用 sizeof
关键字可以统计数据类型所占内存大小
语法:sizeof(数据类型/变量)
2.3 浮点型
作用:表示小数
浮点型分为两种:float 和 double
两者的区别在于表示的有效数字范围不同
数据类型 | 占用空间 | 有效数字范围 |
---|---|---|
float | 4字节 | 7位有效数字 |
double | 8字节 | 15~16位有效数字 |
注意:声明单精度时,建议在数字后面加上 f
,即
float f = 3.14f;
实例:科学计数法
float f1 = 3e2; // 3 * 10 ^ 2
float f2 = 3e-2; // 3 * 0.1 ^ 2
2.4 字符型
作用:表示单个字符
语法:char ch = 'a';
注意:
- 在显示字符型变量时,用单引号将字符括起来,不要用双引号
- 单引号内只能有一个字符,不可以是字符串
- C 和 C++中字符型变量只占用1个字节
- 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元
2.5 转义字符
作用:表示一些不能显示出来的ASCII字符
常用的转义字符有:\n
、\\
、 \t
2.6 字符串型
作用:表示一串字符
两种风格:
-
C风格字符串:
char 变量名[] = "字符串值";
实例:char str[] = "hello, world"; cout << str << endl;
-
C++风格字符串:
string 变量名 = "字符串值";
注意:使用时,需要包含头文件
#include <string>
实例:string str = "hello, world"; cout << str << endl;
2.7 布尔类型
作用:表示真或假的值
bool类型只有两个值:
- true --- 真(本质是1)
- false --- 假 (本质是0)
bool类型占1个字节大小
2.8 数据的输入
作用:用于从键盘获取数据
关键字:cin
语法:cin >> 变量
实例:
// 整型
int a = 0;
cout << "请给整型变量a赋值" << endl;
cin >> a;
cout << "整型变量a = " << a << endl;
// 浮点型
float f = 0.1f;
cout << "请给浮点型变量f赋值" << endl;
cin >> f;
cout << "浮点型变量f = " << f << endl;
// 字符型
char ch = 'a';
cout << "请给字符型变量f赋值" << endl;
cin >> ch;
cout << "字符型变量ch = " << ch << endl;
// 字符串型
string str = "hello";
cout << "请给字符串型变量str赋值" << endl;
cin >> str;
cout << "字符串型变量str = " << str << endl;
// 布尔类型
bool flag = false;
cout << "请给布尔类型变量flag赋值" << endl;
cin >> flag;
cout << "布尔类型变量flag = " << flag << endl;
2 运算符
以下几类运算符:
运算符类型 | 作用 |
---|---|
算数运算符 | 处理四则运算 |
赋值运算符 | 将表达式的值赋给变量 |
比较运算符 | 表达式的比较,并返回一个真或假 |
逻辑运算符 | 根据表达式的值返回真或假 |
2.1 算数运算符
作用:处理四则运算
包括以下符号:
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | -3 | -3 |
+ | 加 | 10 + 5 | 15 |
- | 减 | 10 - 5 | 5 |
* | 乘 | 10 * 5 | 50 |
/ | 除 | 10 / 5 | 2 |
% | 取模(取余) | 10 % 3 | 1 |
++ | 前置递增 | a=2; b=++a; | a=3;b=3; |
++ | 后置递增 | a=2; b=a++; | a=3;b=2; |
-- | 前置递减 | a=2; b=--a; | a=1;b=1; |
-- | 后置递减 | a=2; b=a--; | a=1;b=2; |
2.2 赋值运算符
作用:将表达式的值赋给变量
包括以下几个符号:
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
= | 赋值 | a=2;b=3; | a=2;b=3; |
+= | 加等于 | a=0;a+=2; | a=2; |
-= | 减等于 | a=5;a-=3; | a=2; |
*= | 乘等于 | a=2;a*=2; | a=4; |
/= | 除等于 | a=4;a/=2; | a=2; |
%= | 模等于 | a=3;a%=2; | a=1; |
2.3 比较运算符
作用:用于表达式的比较,并返回一个真值或假值
有以下几个符号:
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
== | 相等于 | 4 == 3 | 0 |
!= | 不等于 | 4 != 3 | 1 |
< | 小于 | 4 < 3 | 0 |
> | 大于 | 4 > 3 | 1 |
<= | 小于等于 | 4 <= 3 | 0 |
>= | 大于等于 | 4 >= 1 | 1 |
2.4 逻辑运算符
作用:根据表达式的值返回真或假
有以下几个符号
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
! | 非 | !a | 如果a为假,则!a为真;如果a为真,则!a为假 |
&& | 与 | a && b | 如果a和b都为真,则结果为真,否则为假 |
|| | 或 | a || b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假 |
3 程序流程结构
C++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构
- 顺序结构:程序按顺序执行,不发生跳转
- 选择结构:依据条件是否满足,有选择的执行相应代码
- 循环结构:依据条件是否满足,循环多次执行某段代码
3.1 选择结构
3.1.1 if语句
作用:执行满足条件的语句
if语句的三种形式
- 单行格式 if 语句
- 多行格式 if 语句
- 多条件 if 语句
-
单行格式 if 语句
if (条件) { 条件满足执行语句; }
-
多行格式 if 语句
if (条件) { 条件满足执行语句; } else { 条件不满足执行语句; }
-
多条件 if 语句
if (条件1) { 条件1满足执行语句; } else if (条件2) { 条件2满足执行语句; } ... else { 都不满足执行语句; }
3.1.2 三目运算符
作用:通过三目运算符实现简单的判断
语法:表达式1 ? 表达式2 : 表达式3
3.1.3 switch语句
作用:执行多条件分支语句
语法:
switch(表达式) {
case 结果1: 执行语句; break;
case 结果2: 执行语句; break;
...
default: 执行语句; break;
}
3.2 循环结构
3.2.1 while循环语句
作用:满足循环条件,执行循环语句
语法:
while(循环条件) {
循环语句;
}
3.2.2 do while 循环语句
作用:满足循环条件,执行循环语句
语法:
do {
循环语句
} while(循环条件);
注意:与 while
的区别在于 do while
会先执行一次循环语句,再判断循环条件
3.2.3 for循环语句
作用:满足循环条件,执行循环语句
语法:
for (起始条件;条件表达式;末尾循环体) {
循环语句;
}
3.3 跳转语句
3.3.1 break语句
作用:用于跳出选择结构或循环结构
break使用的时机:
- 出现在switch条件语句中,作用是终止case并跳出switch
- 出现在循环语句中,作用是跳出当前的循环语句
- 出现在嵌套循环中,跳出最近的内层循环语句
3.3.2 continue语句
作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
3.3.3 goto语句
作用:无条件跳转语句
语法:goto 标记;
解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置
cout << "1" << endl;
cout << "2" << endl;
goto FLAG;
cout << "3" << endl;
cout << "4" << endl;
FLAG:
cout << "5" << endl;
4 数组
4.1 一维数组
一维数组的定义方式:
数据类型 数组名[数组长度];
数据类型 数组名[数组长度] = {值1, 值2, ...};
数据类型 数组名[] = {值1, 值2, ...};
一维数组数组名
用途:
- 统计整个数组在内存中的长度:数组长度
sizeof(arr)/sizeof(arr[0])
- 获取数组在内存中的首地址
4.2 二维数组
二维数组定义方式:
数据类型 数组名[行数][列数];
数据类型 数组名[行数][列数] = {{数据1, 数据2,...}, {数据n, 数据m,...}, ...};
数据类型 数组名[行数][列数] = {数据1, 数据2, ...};
数据类型 数组名[][列数] = {数据1, 数据2, ...};
二维数组数组名
用途:
-
查看二维数组所占内存空间
二维数组行数:
sizeof(arr)/sizeof(arr[0])
;二维数组列数:
sizeof(arr[0])/sizeof(arr[0][0])
-
获取二维数组首地址
5 函数
将一段经常使用的代码封装起来,减少重复代码
5.1 函数定义
包含:返回值类型、函数名、参数列表、函数体语句、return表达式
语法:
返回值类型 函数名(参数列表) {
函数体语句;
return表达式;
}
5.2 函数调用
语法:函数名(参数)
5.3 值传递
- 所谓值传递,就是函数调用时实参将数值传入给形参
- 值传递时,如果形参发生变化,并不会影响实参
5.4 函数的常见样式
常见的函数样式有4种:
- 无参无返
- 有参无返
- 无参有返
- 有参有返
5.5 函数的声明
作用:告诉编译器函数名称及如何调用函数,函数的实际主体可以单独定义。
- 函数的声明可以多次,但函数的定义只能有一次
5.6 函数分文件编写
函数分文件编写一般有4个步骤
- 创建后缀名为.h的头文件
- 创建后缀名为.cpp的源文件
- 在头文件中写函数声明
- 在源文件中写函数定义
使用时在主文件中使用 #include "***.h"
示例:
// 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;
}
6 指针
可以通过指针间接访问内存,指针保存地址
6.1 指针的定义和使用
语法:数据类型 * 变量名;
示例:
int a = 10; // 定义整型变量a
int * p; // 定义指针变量
p = &a; // 指针赋值
*p = 100; //通过 *操作,解引用操作指针地址指向的空间变量
6.2 指针所占的内存空间
32位操作系统下,指针都是占4个字节空间大小,不管是什么数据类型
64位操作系统下,指针都是占8个字节空间大小
6.3 空指针和野指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的,即不能进行 *p
操作
示例:
int * p = NULL;
野指针:指针变量指向非法的内存空间
示例:
int * p = (int *)0x1100;
// 访问野指针报错
cout << *p << endl;
结论:空指针和野指针都不是我们申请的空间,因此不要访问它。
6.4 const修饰指针
const修饰指针有三种情况:
-
const修饰指针:常量指针 ,例如
const int * p = &a;
特点:指针的指向可以修改,但指针指向的值不可以修改
解释:*p是内存空间里的数据,p是内存空间的地址;const修饰的指针是常量,即const int 后面的(*p)不可以修改,即内存空间里的数据不可以修改(10不能改),但是p可以改变,即指向可以改变 -
const修饰常量:指针常量,例如
int * const p = &a;
特点:指针的指向不能更改,但是指针指向的值可以修改
-
const既修饰指针,又修饰常量,例如
const int * const p = &a;
特点:指针的指向和指针指向的值都不能更改
示例:
int a = 10;
int b = 10;
const int * p = &a;
*p = 20; // 错误,指针指向的值不能修改
p = &b; // 正确
int * const p = &a;
*p = 20; // 正确,指针指向的值可以修改
p = &b; // 错误,指针的指向不能修改
结论:const修饰谁,谁不能改。
6.5 指针和数组
作用:利用指针访问数组中的元素
示例:
int main() {
// 利用指针访问数组中的元素
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "第一个元素为:" << arr[0] << endl;
int * p = arr; // 数组名就是首地址
cout << "利用指针访问第一个元素:" << *p << endl;
p++; // 让指针向后偏移4个字节
cout << "利用指针访问第二个元素:" << *p << endl;
system("pause");
return 0;
}
6.6 指针和函数
作用:利用指针作函数参数,可以修改实参的值
示例:
// 值传递
void swap1(int a, int b) {
int temp = a;
a = b;
b = temp;
}
// 地址传递
void swap2(int * p1, int * p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
7 结构体
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
7.1 结构体的定义和使用
语法:struct 结构体名{ 结构体成员列表 };
通过结构体创建变量的方式有三种:
struct 结构体名 变量名
struct 结构体名 变量名 = {成员1值, 成员2值, ...}
- 定义结构体时顺便创建变量
结构体变量创建时,struct
关键字可以省略。
示例:
// 学生类型
struct Student {
string name;
int age;
int score;
};
// 通过学生类型,创建变量
struct Student s1;
s1.name = "小王";
s1.age = 8;
s1.score = 100;
struct Student s2 = {"小王", 8, 100};
struct Student {
...
}s3;
s3.name = "小王";
s3.age = 18;
s3.score = 100;
7.2 结构体数组
作用:将自定义的结构体放入到数组中方便维护。
语法:struct 结构体名 数组名[元素个数] = {{}, {}, ...};
示例:
// 结构体定义
struct Student {
string name;
int age;
int score;
};
int main() {
// 结构体数组
struct Student arr[3] = {
{"张三", 18, 90},
{"李四", 18, 92},
{"王五", 18, 98}
};
}
7.3 结构体指针
作用:通过指针访问结构体中的成员
利用操作符 ->
可以通过结构体指针访问结构体属性
示例:
struct Student {
string name;
int age;
int score;
};
int main() {
//创建学生结构体变量
Student s = {"张三", 18, 100};
// 通过指针指向结构体变量
Student * p = &s;
// 通过指针访问结构体变量中的数据
cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->age << endl;
system("pause");
return 0;
}
7.4 结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体
例如:每个老师辅导一个学生,一个老师的结构体中,记录一个学生的结构体
示例:
// 学生结构体
struct Student {
string name;
int age;
int score;
};
// 教师结构体
struct Teacher {
int id;
string name;
int age;
struct Student stu;
};
int main() {
Teacher t;
t.id = 1000;
t.name = "老王";
t.age = 50;
t.stu.name = "小王";
t.stu.age = 30;
t.stu.score = 100;
cout << "老师姓名:" << t.name << "老师年龄:" << t.age << endl;
system("pause");
return 0;
}
7.5 结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式有两种:
- 值传递
- 地址传递
示例:
// 学生结构体
struct Student {
string name;
int age;
int score;
};
// 值传递
void printStudent1(Student s) {
s.age = 100;
cout << "子函数1中打印:" << s.name << " " << s.age << " " << s.score << endl;
}
//地址传递
void printStudent2(Student * s) {
cout << "子函数2中打印:" << s->name << " " << s->age << " " << s->score << endl;
}
int main() {
Student s = { "张三", 18, 60 };
cout << "main函数打印:" << s.name << " " << s.age << " " << s.score << endl;
printStudent1(s);
printStudent2(&s);
system("pause");
return 0;
}
7.6 结构体中const使用场景
作用:用 const
来防止误操作
示例:
// 学生结构体
struct Student {
string name;
int age;
int score;
};
void printStudent(const Student * s) {
// s->age = 18; // 报错,不能修改
cout << "打印学生信息:" << s->name << " " << s->age << " " << s->score << endl;
}
int main() {
Student s = { "张三", 18, 60 };
printStudent(&s);
system("pause");
return 0;
}
标签:语句,入门,示例,int,笔记,运算符,C++,结构,指针
From: https://www.cnblogs.com/DevilK/p/17265503.html