c++核心编程
1内存分区类型
1.1程序运行前
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TFsAerNy-1627470181212)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627443512693.png)]
示例:
using namespace std;
int x = 10;
int y = 10;
const int z = 10;
int maind101() {
//全局区
//全局变量 静态变量 常量
//创建普通局部变量
int a = 10;
int b = 10;
cout << "地址 a:" << (int)&a << endl;
cout << "地址 b:" << (int)&b << endl;
cout << "全局 地址x:" << (int)&x << endl;
cout << "全局 地址y:" << (int)&y << endl;
//静态变量
static int s_a = 10;
static int s_b = 10;
cout << "静态 地址s_a:" << (int)&s_a << endl;
cout << "静态 地址s_b:" << (int)&s_b << endl;
//常量
//字符串常量
cout << "字符串常量的地址:" << (int)&"hello world" << endl;
//const修饰的全局和局部
const int t = 10;
cout << "const修饰的全局的" << (int)&z << endl;
cout << "const修饰的jubu的" << (int)&t << endl;
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FwESvy0O-1627470181215)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627443495970.png)]``
1.2程序运行后
示例 :
using namespace std;
//栈区数据注意事项----不要返回局部变量的地址
//栈区的数据由编译器管理开辟和释放
int *func() {//形参数据也会放在栈区
int a = 10;//局部变量
return &a;//返回局部变量的地址
}
int main() {
int *p = func();
cout << *p << endl;//第一次打印正确是因为编译器做了保留
cout << *p << endl;//第二次就不保留了
return 0;
}
堆区
#include<iostream>
using namespace std;
int* func() {
int* a = new int(10);
return a;
}
int main() {
int *p = func();
cout << *p << endl;
cout << *p << endl;
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1UEQSQ6v-1627470181216)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627450284637.png)]
1.3new操作符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EcoQa4PR-1627470181217)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627450339043.png)]
示例1 基本语法
using namespace std;
//1 new的基本语法
int* f() {
//在堆区创建一个整型的数据
//new返回的是 该数据类型的指针
int* a = new int(10);
return a;
}
void test01() {
int* p = f();
cout << *p << endl;
cout << *p << endl;
//堆区的数据由程序员管理开辟和释放
//如果想释放堆区的数据,利用关键字 delete
delete p;//释放了p的内存
cout << *p << endl;//内存已经被释放,在此操作非法
}
int main() {
test01();
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RPMDxej-1627470181218)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627451095184.png)]
!!!内存已经被释放,所以进程推出!!!
示例2 开辟数组
int main(){
//创建10整型数据的数组,在堆区
int* arr = new int[10];//10代表数组有10个元素
for (int i = 0; i < 10; i++) {
arr[i] = i + 100;
}
for (int i = 0; i < 10; i++) {
cout << arr[i] << endl;}
//释放这个数组时加[]
delete[] arr;
return 0;
}
2 引用
2.1 引用的基本使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QmQ2NgJy-1627470181220)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627452725616.png)]
示例:
using namespace std;
int main() {
int a = 10;
int& b = a;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
b = 100;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
2.2 引用的注意事项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B9qq5blx-1627470181220)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627453657538.png)]
示例:
int &b = a;//正确,定义就初始化
int &b;错误,没有初始化
int a = 10;
int c = 20;
int &b = a;
&b = c;//这一步错误,已经爱了a,不能爱c
b = c;//这很正确,只是赋值相当于"b = 20;"
2.3 引用做函数参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WpKo5CH7-1627470181221)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627456618411.png)]
示例:
using namespace std;
//交换函数
//1值传递
void zhi(int a,int b) {
int t = a;
a = b;
b = t;
cout << "zhi a = " << a << endl;
cout << "zhi b = " << b << endl;
}
//2 地址传递
void dizhi(int*a,int*b) {
int t = *a;
*a = *b;
*b = t;
cout << "dizhi a = " << *a << endl;
cout << "dizhi b = " << *b << endl;
}
//引用传递!!!!!!!!!!!!!!!!!!!!!!!!!!!!关键!!!!!!!!!!!!!!!!
void yinyong(int &a,int &b) {
int t = a;
a = b;
b = t;
cout << "yy a = " << a << endl;
cout << "yy b = " << b << endl;
}
int main() {
int a = 10;
int b = 20;
zhi(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
a = 10; b = 20;
dizhi(&a, &b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
a = 10; b = 20;
yinyong(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TreZCxWP-1627470181222)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627462655266.png)]
2.4 引用做函数返回值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WhJh3eAV-1627470181222)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627462753128.png)]
示例
using namespace std;
//引用做函数的返回值
//1 不要返回局部变量的引用
int& test_1() {
int a = 10;
return a;
}int& test_2() {
static int a = 10;//静态在全局,里面的数据在结束后系统释放
return a;
}
//2 函数的调用可以作为左值
int main() {
int& f = test_1();
cout << f << endl;//第一次正确做了保留
cout << f << endl;//乱码
int& f1 = test_2();
cout << f1 << endl;
cout << f1 << endl;
test_2() = 10000;//相当于a = 10000;如果函数的返回值是引用,可以作为左值
cout << f1 << endl;
cout << f1 << endl;
return 0;
}
2.5 引用的本质
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xO346jVR-1627470181223)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627463820634.png)]
示例
using namespace std;
void funcc(int&r) {
r = 100;
}
int main() {
int b = 10;
int& r = b;//自动转换为int * const r = &b;指针指向不能改,也就是引用不可以改
r = 20;//内部发现是引用转换为 *r = 20;
cout << "b = " << b << endl;
cout << "r = " << r << endl;
funcc(b);
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s2B3hfhZ-1627470181223)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627466842445.png)]
2.6 常量引用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IIBds8CW-1627470181224)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627467534049.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xtF1dasn-1627470181225)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627468871811.png)]
using namespace std;
//常量引用
//使用场景:用来修饰形参,防止误操作
void show(const int& f) {
f = 1000;//加了const不能修改了;这里是错误点
cout << "f = " << f << endl;
}
void a() {
int a = 10;
/*加上count之后,编译器将代码修改成
int temp = 10; const int &ref = temp;也就不能修改了*/
const int& ref = 10;//引用必须引一块合法内存空间
}
int main() {
int a = 10;
show( a);
cout << a << endl;
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Ysp9DlR-1627470181225)(C:\Users\才是最实在\AppData\Roaming\Typora\typora-user-images\1627468668669.png)]
{
f = 1000;//加了const不能修改了;这里是错误点
cout << "f = " << f << endl;
}
void a() {
int a = 10;
/*加上count之后,编译器将代码修改成
int temp = 10; const int &ref = temp;也就不能修改了*/
const int& ref = 10;//引用必须引一块合法内存空间
}
int main() {
int a = 10;
show( a);
cout << a << endl;
return 0;
}
[外链图片转存中...(img-2Ysp9DlR-1627470181225)]