c++核心编程

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程序运行后

1627443615561

示例 :

using namespace std;
//栈区数据注意事项----不要返回局部变量的地址
//栈区的数据由编译器管理开辟和释放
int *func() {//形参数据也会放在栈区
	int a = 10;//局部变量
	return &a;//返回局部变量的地址
}
int main() {
	int *p = func();
	cout << *p << endl;//第一次打印正确是因为编译器做了保留
	cout << *p << endl;//第二次就不保留了
	return 0;
}

堆区

1627448458244
#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)]

示例

1627465136621
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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值