你敢花一天时间看完本文在简历上添一笔“熟练使用C++编程”吗?
基础
1 数据
1.1 常量、变量和helloworld的写法
- #define day 7
- const修饰变量
#include <iostream>using namespace std;
// 常量
#define day 7int main() {// 常量const int a = 14;// 变量int b = 16;cout << "a= " << day << endl;cout << "Hello的World!" << endl;return 0;
}
1.2 数据类型
short的取值范围是-32768~32767
1.3 sizeof关键字
#include <iostream>using namespace std;
// 常量
#define day 7int main() {int a = 10;cout << "short类型所占内存空间为:" << sizeof(short)<<endl;cout << "int类型所占内存空间为:" << sizeof(a)<<endl;cout << "long类型所占内存空间为:" << sizeof(long)<<endl;cout << "long类型所占内存空间为:" << sizeof(long long)<<endl;return 0;
}
1.4 浮点型
float占用空间4字节,7位有效数字(3.14是三位有效数字)
double占用8字节,15~16位有效数字,默认是双精度
1.5 字符型
需要单引号,占位1
#include <iostream>using namespace std;int main() {char ch = 'a'; // 需要单引号cout << "ch: "<< ch << endl;//字符型占用内存大小cout << "sizeof_char: " << sizeof(ch) << endl; // 1cout << (int) ch << endl; //强转int可得到ascii编码
}
1.6 科学计算
#include <iostream>using namespace std;int main() {float f2 = 3e2; // 3 * 10 ^ 2 = 300cout << f2 << endl;float f3 = 3e-2; // 3 * 0.1 ^ 2 = 0.03cout << f3 << endl;return 0;
}
1.7 转义字符
1.8 字符串
#include <iostream>
#include <string>using namespace std;int main() {// 字符串string str1 = "hello world!";cout << str1 << endl;
}
1.9 布尔类型bool
#include <iostream>
#include <string>using namespace std;int main() {// 布尔,所占空间都为1bool flag1 = true; // 1cout << flag1 << endl;bool flag2 = false; // 0cout << flag2 << endl;
}
1.10 数据的输入
输入符号位cin >>
#include <iostream>
#include <string>using namespace std;int main() {// 数据的输入int a = 0;cout << "请给整型变量a赋值: " << endl;cin >> a;cout << "整型变量a= : " << a << endl;
}
2 运算符
2.1 加减乘除、取模、递增和递减运算符运算符
#include <iostream>
#include <string>using namespace std;int main() {// 运算符int a = 10;int b = 3;//加减乘除cout << a + b << endl;cout << a - b << endl;cout << a * b << endl;cout << a / b << endl; // 默认为3,整型会去除小数部分cout << "----------------" << endl;// 取模运算int c = 10;int d = 3;cout << c % d << endl; //d不能为0,两个小数不能做取模运算cout << "----------------" << endl;// 递增、递减运算符int e = 10;int f = 10;++e;cout << e << endl;f++;cout << f << endl;int g = 15;int h = ++g * 10;cout << h << endl; // 160int i = 15;int j = i++ * 10;cout << j << endl; // 160
}
2.2 赋值运算符
加减乘除都可以用,只放一个
#include <iostream>
#include <string>using namespace std;int main() {// 赋值运算符int a = 10;a += 1; // a = a + 2cout << a <<endl;
}
2.3 比较运算符
2.4 逻辑运算符
#include <iostream>
#include <string>using namespace std;int main() {// 逻辑运算符int a = 10; // 整型为真(1)cout << "!10: " << !a << endl;int b = 0; // 0为假(0)cout << "!0: " << !b << endl;cout << "0与1: " << (a&&b) << endl;cout << "0或1: " << (a||b) << endl;
}
3 流程结构
3.1 if语句
#include <iostream>
#include <string>using namespace std;int main() {// if语句int score = 0;cout << "请输入一个分数:" << endl;cin >> score;cout << "您输入的分数为: " << score << endl;if (score > 600)cout << "恭喜您考上了一本大学!" << endl;else if (score > 500)cout << "您考上了二本大学!" << endl;elsecout << "您没有考上二本大学!" << endl;
}
3.2 三目运算符
#include <iostream>
#include <string>using namespace std;int main() {// 三目运算符int a = 10;int b = 20;int c = 0;c = (a > b ? a : b);cout << c << endl; // a > b就返回a,否则返回b(a > b ? a : b) = 100;cout << a << endl;cout << b << endl; // a > b就给a赋值100,否则b
}
3.3 switch语句
#include <iostream>
#include <string>using namespace std;int main() {// sitch语句cout << "请给电影打分: " << endl;int score = 0;cin >> score;cout << "您打的分数为: " << score <<endl;switch (score) {case 10:cout << "您认为是经典电影" << endl;break;case 9:cout << "您认为是经典电影" << endl;break;case 8:cout << "您认为电影还可以" << endl;break;}
}
3.4 while循环
#include <iostream>
#include <string>using namespace std;int main() {// while循环int num = 0;while(num < 10) {cout << num << endl;num += 1;}
}
3.5 while循环小游戏
#include <iostream>
#include <string>
#include <ctime>using namespace std;int main() {// while循环练习案例:猜数字// 生成0-100的随机数srand((unsigned int) time(NULL));int num = rand() % 100 + 1;
// cout << num << endl;int val = 0; // 玩家输入的数据while(1) {cin >> val;if (val > num) {cout << "猜测过大!" << endl;} else if (val < num) {cout << "猜测过小!" << endl;} else {cout << "猜测成功!" << endl;break;}}
}
3.6 for循环
#include <iostream>using namespace std;int main() {// for循环for (int i = 0; i < 10; i++) {cout << i << endl;}
}
3.7 for循环案例
#include <iostream>using namespace std;int main() {// for循环for (int i = 1; i <= 100; i++) {if(i % 10 == 7){cout << "敲桌子!" << endl;} else if(i >= 70 && i <80){cout << "敲桌子!" << endl;}else if (i % 7 == 0){cout << "敲桌子!" << endl;}else{cout << i << endl;}}
}
3.8 循环案例 - 乘法口诀表
#include <iostream>using namespace std;int main() {// for循环for (int i = 1; i <= 9; i++){for (int j = 1; j <= i; j++){cout << i << "*" << j << " = " << i * j << " ";}cout << endl;}
}
3.9 跳转语句
3.9.1 break语句
跳出当前的循环语句,比continue跳的更外面
3.9.2 continue语句
在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
3.9.3 goto语句
不推荐使用
4 数组
4.1 数组的声明与赋值
#include <iostream>using namespace std;int main() {// 数组//第一种定义方式int arr[5];arr [0] = 10;arr [1] = 20;arr [2] = 30;arr [3] = 40;arr [4] = 50;//第二种定义方式int arr2[5] = {1, 2, 3, 4, 5};//第三种定义方式int arr3[] = {1, 2, 3, 4, 5, 6, 7};for (int i = 0; i < 5; i++) {cout << arr[i] << endl;}
}
4.2 一维数组名的
用途:
- 统计数组的长度
- 获取数组内存中的首地址
4.3 求数组最大值
#include <iostream>using namespace std;int main() {// 数组//第一种定义方式int max = 0;int arr[6] = {3, 1, 2, 3, 4, 2};for (int i = 0; i < 6; i++) {if (arr[i] > max){max = arr[i];}}cout << "最大值为:" << max << endl;
}
4.4 数组逆置
#include <iostream>using namespace std;int main() {// 数组//第一种定义方式int arr[6] = {3, 1, 2, 3, 4, 2};int start = 0;int end = sizeof(arr) / sizeof(int) -1;while (start < end) {int tem = arr[start];arr[start] = arr[end];arr[end] = tem;start++;end--;}for (int j = 0; j < 6; j++) {cout << arr[j];}
}
4.5 冒泡排序
#include <iostream>using namespace std;int main() {// 数组//第一种定义方式int arr[6] = {3, 1, 2, 3, 4, 2};for (int i = 0; i < 6 - 1; i++) {for (int j = 0; j < 6 - 1 - i; j++) {if (arr[j] > arr[j + 1]) {int tem = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tem;}}}for (int k = 0; k < 6; k++) {cout << arr[k]<< endl;}
}
4.6 二维数组
#include <iostream>using namespace std;int main() {// 数组//第一种定义方式int arr1[2][3];arr1[0][0] = 1;arr1[0][1] = 2;arr1[0][2] = 3;arr1[1][0] = 4;arr1[1][1] = 5;arr1[1][2] = 6;for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++){cout << arr1[i][j] << endl;}}
}
4.7 二维数组案例 - 成绩统计
#include <iostream>using namespace std;int main() {// 数组//第一种定义方式int arr1[2][3];arr1[0][0] = 100;arr1[0][1] = 100;arr1[0][2] = 100;arr1[1][0] = 90;arr1[1][1] = 50;arr1[1][2] = 100;arr1[2][0] = 60;arr1[2][1] = 70;arr1[2][2] = 80;for (int i = 0; i < 3; i++) {int sum_ = 0;for (int j = 0; j < 3; j++){sum_ += arr1[i][j];}cout << sum_ << endl;}
}
5 函数
作用:将一段经常使用的代码封装起来,减少重复代码
5.1 函数的定义和调用
- 返回值类型
- 函数名
- 参数列表
- 函数体语句
- return表达式
#include <iostream>using namespace std;int add(int num1, int num2) {return num1 + num2;
}int main() {// 函数cout << add(1, 2) << endl;
}
5.2 值传递
函数中的值发生了改变,函数外的值没变
#include <iostream>using namespace std;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;
}int main() {// 值传递int num1 = 10;int num2 = 20;swap(num1, num2);cout << "实参没变: " << endl;cout << "num1: " << num1 << endl;cout << "num2: " << num2 << endl;
}
5.3 函数的声明
- 提前告诉编译器有这个函数
- 可以有多次声明
5.4 函数的分文件编写
步骤:
- 创建后缀名为.h的头文件
- 创建后缀名为.cpp的源文件
- 在头文件中写函数的生命
- 在源文件中写函数的定义
示例:创建swap.cpp和swap.h 都需要在一个目录下
swap.h文件:
#include <iostream>
using namespace std;// 函数的声明
void swap(int a, int b);
swap.cpp文件:
#include "swap2.h"
#include <iostream>
using namespace std;
//
// Created by 万方名 on 2020-05-23.
//void swap(int a, int b) {int temp = a;a = b;b = temp;cout << a<< endl;cout << b<< endl;}
主文件:
#include <iostream>
#include "swap2.h"using namespace std;int main() {// 值传递int num1 = 10;int num2 = 20;swap(num1, num2);cout << "实参没变: " << endl;cout << "num1: " << num1 << endl;cout << "num2: " << num2 << endl;
}
6 指针
6.1 指针的基本概念
作用:可以通过指针间接访问内存
- 内存编号从0开始记录,一般用十六进制数字表示
- 可以利用指针变量保存地址
6.2 指针的定义和使用
#include <iostream>
#include "swap2.h"using namespace std;int main() {// 指针// 定义变量int a = 10;// 定义指针int *p;// 让指针记录变量a的地址p = &a;cout << p << endl;// 解指针cout << *p <<endl;// 通过指针更改变量的值*p = 1000;cout << "a: " << a << endl;cout << "*p: " << *p << endl;
}
6.3 指针所占内存空间
- 32位系统下占四个字节
- 64位系统下占八个字节
#include <iostream>using namespace std;int main() {// 指针// 定义变量int a = 10;int *p = &a;cout << *p << endl;cout << sizeof(p) << endl;cout << sizeof(char *) << endl;cout << sizeof(float *) << endl;cout << sizeof(double *) << endl;
}
6.4 空指针和野指针
6.4.1 空指针:指针变量指向内存中编号为0的空间
- 用途:初始化指针变量
- 注意:空指针指向的内存是不可访问的
#include <iostream>using namespace std;int main() {// 空指针int *p = NULL;// 不可访问cout << *p << endl;
}
6.4.2 野指针:指针变量指向非法的内存空间
在程序中尽量避免出现野指针
#include <iostream>using namespace std;int main() {// 野指针int *p = (int *) 0x1100;// 报错cout << *p << endl;
}
6.5 const修饰指针
三种情况:
- const修饰指针 - 常量指针
- const修饰常量 - 指针常量
- const即修饰指针又修饰常量
#include <iostream>using namespace std;int main() {// 1.常量指针int a = 10;int b = 20;// 定义常量指针const int *p = &a;// *p = 20; // 报错,常量指针的值不可修改p = &b; // 不报错,指针可以重新指向bcout << *p << endl;// 2.指针常量int c = 30;int d = 40;// 定义指针常量int *const p2 = &c;*p2 = 50; // 不报错,指针的值可以修改// p2 = &d; // 报错,指针不可更改指向cout << *p2 << endl;//3. const修饰指针和指针常量时不可更改值和指向
}
6.6 指针和数组
作用:利用指针访问数组元素
#include <iostream>using namespace std;int main() {// 指针和数组int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int *p = arr;cout << *p << endl; // 返回数组的第一个元素// 利用指针遍历数组for (int i = 0; i < 10; i++) {cout << *p << endl;p++;}
}
6.7 指针和函数
作用:利用指针作函数参数,可以修改实参的值
#include <iostream>using namespace std;void swap4(int a, int b) {cout << "值传递"<< endl;int temp = a;a = b;b = temp;
}void swap5(int *a, int *b) {cout << "地址传递"<< endl;int temp2 = *a;*a = *b;*b = temp2;
}int main() {// 指针和函数//1. 值传递int a = 10;int b = 20;swap4(a, b);cout << a<< endl;cout << b<< endl;cout << "------分界线------"<< endl;//2. 地址传递swap5(&a, &b);cout << a<< endl;cout << b<< endl;
}
6.8 指针、数组和函数的案例
案例描述:封装一个函数,利用冒泡排序,实现对整型数组的升序排序
#include <iostream>using namespace std;void bubble_sort(int *arr, int len){for (int i = 0; i < len - 1; i++) {for (int j = 0; j < len - 1 - i; j++) {if (arr[j] > arr[j + 1]) {int tem = arr[j];arr[j] = arr[j+1];arr[j+1] = tem;}}}
}int main() {// 定义数组int arr[] = {1, 2, 32, 3, 5, 6, 23};bubble_sort(arr, sizeof(arr) / sizeof(arr[0]));for (int i = 0; i < sizeof(arr) / sizeof(arr[0]);i++) {cout << arr[i] << endl;}
}
进阶
7 结构体
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
7.1 结构体的定义与使用
通过结构体创建变量的方式有三种:
- struct结构体名 变量名
- struct结构体名 变量名 = {成员1值,成员2值…}
- 定义结构体时顺便创建变量
#include <iostream>using namespace std;int main() {//结构体struct student {string name; // 姓名int age; // 年龄int score; // 分数};student a = student();a.age = 10;cout << a.age << endl;
}
7.2 结构体数组
作用:将自定义的结构体放入到数组中方便维护
#include <iostream>using namespace std;struct student {string name; // 姓名int age; // 年龄int score; // 分数
};int main() {//结构体student arr[3] = {{"张三", 18, 60},{"李四", 20, 70}};for (int i = 0; i < 3; i++) {cout << "姓名:" << arr[i].name<< "年龄: " << arr[i].age<< "分数: " << arr[i].score << endl;}
}
7.3 结构体指针
作用:通过指针访问结构体中的成员
#include <iostream>using namespace std;struct student {string name; // 姓名int age; // 年龄int score; // 分数
};int main() {//结构体指针student stu = {"张三", 18, 80};student *p = &stu;cout << p->score<< endl;
}
7.4 结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体
#include <iostream>using namespace std;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 = 1;t.name = "老万";t.age = 50;t.stu.name = "小万";t.stu.age = 18;t.stu.score = 80;cout << "学生的年龄:" << t.stu.age << endl;
}
7.5 结构体做函数参数
将结构体作为参数向函数中传递
传递方式:
- 值传递
- 地址传递
#include <iostream>using namespace std;struct student {// 成员列表string name; // 姓名int age; // 年龄int score; // 分数
};// 值传递
void print_stu(student stu){stu.age = 28;cout << stu.name << endl;cout << stu.age << endl;
}// 地址传递
void print_stu2(student *stu){stu->age = 28;cout << stu->name << endl;cout << stu->age << endl;
}int main() {//结构体作为函数参数student t = {"张三", 20, 80};print_stu(t);cout << t.age << endl; // 值传递,函数外没有发生改变cout << "------分界线------" << endl; // 值传递,函数外没有发生改变student t2 = {"李四", 30, 100};print_stu2(&t2);cout << t2.age << endl; // 地址传递,函数外发生改变
}
7.6 结构体中的const
作用:用const来防止误操作
void print_stu(const student *stu){}
这样在函数中就不能修改stu的值了
7.7 结构体案例
#include <iostream>using namespace std;
struct Hero {string name;int age;string sex;
};int main() {//结构体案例struct Hero hero_arr[5] = {{"刘备", 23, "男"},{"张飞", 20, "男"},{"关羽", 22, "男"},{"赵云", 21, "男"},{"貂蝉", 19, "女"},};int len_hero_arr = sizeof(hero_arr) / sizeof(Hero);cout << len_hero_arr << endl;for (int i = 0; i < len_hero_arr; i++) {for (int j = 0; j < len_hero_arr - i; j++) {if (hero_arr[j].age <= hero_arr[j + 1].age) {Hero tem = hero_arr[j];hero_arr[j] = hero_arr[j + 1];hero_arr[j + 1] = tem;}}}for (int i = 0; i < len_hero_arr; i++) {cout << hero_arr[i].name << endl;}
}
8 项目一 - 通讯录管理系统
//
// Created by 万方名 on 2020-05-23.
//#include <iostream>
using namespace std;#include <string>
#define MAX 1000// 菜单界面
void show_menu(){cout << "*************************" << endl;cout << "***** 1、添加联系人 *****" << endl;cout << "***** 2、显示联系人 *****" << endl;cout << "***** 3、删除联系人 *****" << endl;cout << "***** 4、查找联系人 *****" << endl;cout << "***** 5、修改联系人 *****" << endl;cout << "***** 6、清空联系人 *****" << endl;cout << "***** 0、退出通讯录 *****" << endl;cout << "*************************" << endl;
}struct Preson{// 姓名string m_name;//性别 1 男 2 女int m_sex;// 年龄int m_age;// 电话string m_phone;// 住址string m_addr;
};// 通讯录结构体
struct addresss_books{struct Preson person_arr[MAX];int m_size;
};// 添加联系人函数
void add_person(addresss_books *abs) {// 判断通讯录是否已满if (abs->m_size == MAX) {cout << "通讯录已满,无法添加联系人" << endl;return;} else {// 添加具体联系人// 姓名string name;cout << "请输入姓名: "<< endl;cin >> name;abs->person_arr[abs->m_size].m_name = name;// 性别int sex = 0;cout << "请输入性别: "<< endl;cout << "1 --- 男"<< endl;cout << "2 --- 女 "<< endl;cin >> sex;while(true){if (sex == 1 || sex == 2) {abs->person_arr[abs->m_size].m_sex = sex;break;} else {cout << "请重新输入: "<< endl;cout << "1 --- 男"<< endl;cout << "2 --- 女 "<< endl;cin >> sex;}}// 年龄int age;cout << "请输入年龄: "<< endl;cin >> age;abs->person_arr[abs->m_size].m_age = age;// 电话string phone;cout << "请输入电话: "<< endl;cin >> phone;abs->person_arr[abs->m_size].m_phone = phone;// 住址string addr;cout << "请输入家庭住址: "<< endl;cin >> addr;abs->person_arr[abs->m_size].m_addr = addr;// 更新通讯录人数abs->m_size++;cout << "添加成功!" << endl;system("clear");}
}// 2、显示所有联系人
void show_person(addresss_books *abs){// 判断通讯录是否为空if (abs->m_size == 0) {cout << "当前通讯录为空!" << endl;} else {for (int i = 0; i < abs->m_size; i++) {cout << "姓名: " << abs->person_arr[i].m_name << endl;cout << "性别: " << (abs->person_arr[i].m_sex == 1 ? "男" : "女") << endl;cout << "年龄: " << abs->person_arr[i].m_age << endl;cout << "电话: " << abs->person_arr[i].m_phone << endl;cout << "住址: " << abs->person_arr[i].m_addr << endl;cout << "*************************" << endl;}}system("clear");
}int is_exist(addresss_books *abs, string name){for (int i = 0; i < abs->m_size; i++) {if (abs->person_arr[i].m_name == name) {return i;}}return -1; // 如果没有找到,返回-1
}void del_preson(addresss_books *abs){cout << "请输入要删除的联系人姓名: " << endl;string name;cin >> name;int ret = is_exist(abs, name);if (ret != -1){for (int i = 0; i < abs->m_size; ++i) {// 数据前移abs->person_arr[i] = abs->person_arr[i + 1];}abs->m_size--;cout << "联系人删除成功!" << endl;}
}void find_person(addresss_books *abs){cout << "请输入您要查找的联系人: " << endl;string name;cin >> name;int ret = is_exist(abs, name);if (ret != -1) {cout << "姓名:" << abs->person_arr[ret].m_name << "\t";cout << "性别:" << abs->person_arr[ret].m_sex << "\t";cout << "年龄:" << abs->person_arr[ret].m_age << "\t";cout << "电话:" << abs->person_arr[ret].m_phone << "\t";cout << "住址:" << abs->person_arr[ret].m_addr << "\t";}else{cout << "查无此人!" << endl;}system("clear");}void modify_person(addresss_books *abs){cout << "请输入您要修改的联系人:" <<endl;string name;cin >> name;int ret = is_exist(abs, name);if (ret != -1) {string name;cin >> name;cout << "请输入姓名: " << endl;abs->person_arr[ret].m_name = name;int sex;cin >> sex;cout << "请输入性别(1 -- 男 2 -- 女): " << endl;abs->person_arr[ret].m_sex = sex;int age;cin >> age;cout << "请输入年龄: " << endl;abs->person_arr[ret].m_age = age;string phone;cin >> phone;cout << "请输入电话: " << endl;abs->person_arr[ret].m_phone = phone;string addr;cin >> phone;cout << "请输入地址: " << endl;abs->person_arr[ret].m_addr = addr;cout << "修改成功!" << endl;} else {cout << "查无此人!" << endl;}
}void clean_person(addresss_books *abs){abs->m_size = 0;cout << "联系人已清空!" << endl;system("clear");}int main(){// 创建通讯录结构体变量addresss_books abs;abs.m_size = 0;int select = 0;while (true) {show_menu();cin >> select;switch (select) {case 1: // 1、添加联系人add_person(&abs);break;case 2: // 显示联系人show_person(&abs);break;case 3: // 删除联系人del_preson(&abs);break;case 4: // 查找联系人find_person(&abs);break;case 5: // 修改联系人modify_person(&abs);break;case 6:break;case 0: // 退出通讯录cout << "欢迎下次使用" << endl;return 0;break;default:break;}}}
C++核心编程
9 内存模型
9.1 内存四区 - 代码区
作用:存放函数体的二进制代码,由操作系统进行管理
程序运行前:
- 存放CPU执行的机器指令
- 代码区是共享的,共享的目的是对于频繁被执行的程序只需要在内存中有一份代码即可
- 代码区是只读的,原因是防止程序意外地修改了它的指令
9.2 内存四区 - 全局区
作用:存放全局变量和静态变量以及常量
程序运行前:
- 该区域的数据在程序结束后由操作系统释放
#include <iostream>using namespace std;// 全局变量
int g_a = 10;
int g_b = 10;int main() {int a = 10;int b = 10;cout << "局部变量a的地址:" << &a << endl;cout << "局部变量b的地址:" << &b << endl;cout << "全局变量g_a的地址:" << &g_a << endl;cout << "全局变量g_b的地址:" << &g_b << endl;
}
静态变量:在普通变量前加static
9.3 内存四区 - 栈区
作用:由编译器自动分配和释放,存放函数的参数值、局部变量等
注意事项:不要反悔局部变量的地址,栈区开辟的数据由编译器自动释放
9.4 内存四区 - 堆区
作用:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
在C++中主要利用new在堆区开辟内存。
#include <iostream>using namespace std;int * func(){// 利用new关键字,可以将数据开辟到堆区int *p = new int(10);return p;
}int main() {// 在堆区开辟数据int *p = func();cout << *p << endl;
}
9.5 new操作符
- C++利用new操作符在堆区开辟数据
- 堆区开辟的空间由程序员手动释放,释放利用delete操作符
- 利用new创建的数据,会返回概述就对应的类型的指针
#include <iostream>using namespace std;int * func(){// 利用new关键字,可以将数据开辟到堆区int *p = new int(10);return p;
}void test02(){int *arr = new int[10];delete []arr;
}
int main() {// 1、new的基本语法int *p = func();cout << *p << endl;delete p; // 释放堆区的数据// 2、在堆区利用new开辟数组test02();
}
10 引用
10.1 引用示例
作用:给变量起别名
#include <iostream>using namespace std;int main() {// 引用int a = 10;int &b = a;cout << "a = " << a <<endl;cout << "b = " << b <<endl;a = 20;cout << "a = " << a <<endl;cout << "b = " << b <<endl;
}
10.2 引用注意事项
- 引用必须初始化
- 引用在初始化后不可改变
10.3 引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
你敢花一天时间看完本文在简历上添一笔“熟练使用C++编程”吗?相关推荐
- 计算机音乐制作专业美国研究生,美国纽约大学音乐制作专业研究方向有哪些?看完本文汇总就知道了...
音乐学科中有不少的分支专业,音乐制作就是其中之一,音乐制作可以说是科技的产物,对于如今学作曲的人来讲已成为专业技能之一,在美国纽约大学的音乐制作专业样子hi很出色,纽约大学还开设了专门的音乐学院供学生 ...
- 我要用近期业余时间看完这18本书
如题,我要用接下来的空余时间读完这18本书.16英文+2汉化.见证自己英文水准的时候再次来临,顶住. 最近时间比较充裕,又加之从前同事那里转来一台二手mac机器,正好可以让我进入IOS阵营.凭借着自己 ...
- 国服被ban咋看_王者荣耀:赵云不会玩?完美详细攻略教学,看完助你轻松上王者...
王者荣耀:赵云不会玩?国服最细教学:快速发育,三指卡位,看完轻松上王者 目录: 1.版本强度 2.技能解析 3.出装铭文 4.实战教学 一:版本强度 数据来自王者营地 收集巅峰赛1350玩家对局数据 ...
- 让我们一起为宝宝选绘本(怎么给宝宝挑选绘本,看完本文就够了)
我家宝宝跳妹儿从亲子共读开始,买书已经成为我家每月必做的事情,尤其是大型促销活动,更是控制不住地买买买.不过,我从不屯超龄书,都是买的适合跳妹儿该阶段的书. 选书是一件非常花费时间和精力的事情.一提到 ...
- AR属不属于人工智能?看完本文你就懂了
AR/VR常作为孪生兄弟被相提并论,被普遍认为为应用层新技术或者说是"智能可穿戴设备",相比人工智能相对的"算法"标签,显得不够有深度有内涵高大上,那AR和人工 ...
- 这篇文章教会你Python自动化测试需要学什么?怎么去学?从哪里开始学?看完本文学习python目标明确,学习简单粗暴。
一.Python常用领域 Python用于简单脚本编程,如编写2048小游戏或12306的自动抢票软件: Python用于系统编程,如开发系统应用: Python用于开发网络爬虫: 网络爬虫的用途是进 ...
- redis 使用-hiredis库使用(一) 基本篇 看完本文就可以上手工作了
hiredis是redis的客户端sdk,可以让程序操作redis.本文先将建立连接,基本的get/set命令,读写二进制,获取多个结果来讲.假设读者已经了解redis命令了. hiredis的代码也 ...
- 需要显卡还是cpu_装机应该在哪个硬件上省钱, CPU还是显卡, 看完本文就知道了...
电脑是一个整体,由多个部件构成.比较重要的就是主板显卡和CPU,大家在选择这些硬件的时候,首先都会考虑CPU和显卡.因为这两个配件相对来说更加重要,在具体的配件当中价值也相对比较高.所以大家在选择硬件 ...
- Seata Failed to get available servers: endpoint format should like ip:port 报错原因/解决方案汇总版(看完本文必解决问题)
文章目录 一.详细报错信息 二.原因分析 原因1:`service.vgroupMapping`配置的服务组名称不符合Seata默认要求: 原因2:`service.vgroupMapping`配置的 ...
最新文章
- 智能驾驶L2的黄金时代,打磨地图是关键
- C#Post文件上传
- Li‘s 影像组学视频学习笔记(28)-ROI/病灶体积的计算、Li‘s have a solution and plan.
- python编程基础与应用-Python程序设计:从编程基础到专业应用
- kib,mib和mb,kb的区别
- 在.c文件中调用cuda函数
- 阿里技术专家加多:Java异步编程实战之基于JDK中的Future实现异步编程
- IPC--进程间通信二(命名管道)
- 解除电脑宽带限制,提升电脑网速
- QGIS算法列表 (py console输出)
- [Android]Android布局文件中的android:id=@*属性使用方法汇总以及介绍
- 移动安全app渗透测试之渗透流程、方案及测试要点讲解
- 讲座有感——科技论文写作要素
- 易中天品汉代风云人物05:韩信被杀之谜
- LC28 Generate Parentheses
- 《高效能人士的七个习惯》丨一本被书名耽误的必读好书
- 中文乱码字幕视频观看的免费网站
- 我的2013——学习生活总结
- 计算机网络谢希仁版(第七版)答案
- 利用『爬虫』 折衷解决 个人支付宝支付系统 --- 获取账单信息