C++_test_05

一、下列是危险的指针用法,请用代码演示

1.使用NULL指针的内容

#include<iostream>
using namespace std;

int main()
{
	int* p = NULL;
	cout << "p 的值是 " << p;
	return 0;
}

运行结果基于vs2019

2.使用没有初始化的指针变量

#include<iostream>
using namespace std;

int main()
{
	int* p;
	cout << p << endl;
	return 0;
}

运行结果基于vs2019

3.使用已经被delete的指针内容

#include<iostream>
using namespace std;

int main()
{
	int* p = new int;
	(* p) = 3;
	cout << *p << endl;
	delete p;
	cout << *p << endl;
	return 0;
}

运行结果基于vs2019

4.函数返回局部变量的地址

#include<iostream>
using namespace std;

int* sum() {
	int s = 6;
	return &s;
}

int main()
{
	int* p = sum();
	*p = 4;
	cout << *p << endl;
	return 0;
}

在这里插入图片描述

5.由函数申请的堆空间,而由调用者来释放

#include<iostream>
using namespace std;

int* sum(int dwA, int dwB) {
	int* p = new int();
	*p = dwA + dwB;
	return p;
}

int main()
{
	int *p = sum(5,6);
	cout << *p << endl;
	delete p;
	return 0;
}

运行结果基于vs2019

二、一个交换Swap函数,如下所示,请实现一个函数指针指向该函数,并通过函数指针调用该函数。

#include<iostream>
using namespace std;

void swap(int* a, int* b)
{
	int t;
	t = *a;
	*a = *b;
	*b = t;
}

int main()
{
	int a = 6;
	int b = 9;
	void  (*p)(int* , int*);
	p = swap;
	cout << a <<"---"<< b << endl;
	p(&a,&b);
	cout << a <<"---" << b << endl;
	return 0;
}

运行结果基于vs2019
运行结果基于vs2019

三、函数的形参可以是引用

  • 通过引用来传递参数,请分别用代码实现值传递,引用传递,地址传递,并比较优缺点
值传递
#include<iostream>
using namespace std;
void wget(int x, int y)
{
	int tmp;
	tmp = x;
	x = y;
	y = tmp;
	cout << "x=" << x << "\ty=" << y << endl;
}
int main()
{
	int a = 4, b = 6;
	wget(a, b);
	cout << "\na=" << a << "\tb=" << b << endl;
	return 0;
}
引用传递
#include<iostream>
using namespace std;
void wget(int &x, int &y)
{
	int tmp;
	tmp = x;
	x = y;
	y = tmp;
	cout << "x=" << &x << "\ty=" << &y << endl;
}
int main()
{
	int a = 4;
	int	b = 6;
	wget(a, b);
	cout << "\na=" << a << "\tb=" << b << endl;
	return 0;
}
地址传递
#include<iostream>
using namespace std;
void wget(int* x, int* y)
{
	int tmp;
	tmp = *x;
	*x = *y;
	*y = tmp;
	cout << "x=" << *x << "\ty=" << *y << endl;
}
int main()
{
	int a = 4;
	int	b = 6;
	wget(&a, &b);
	cout << "\na=" << a << "\tb=" << b << endl;
	return 0;
}
比较优缺点
  • 传值

把实参的值赋值给行参
对行参的修改,不会影响实参的值

  • 传地址

    传值的一种特殊方式,只是他传递的是地址,不是普通的(int )
    传地址以后,实参和行参都指向同一个对象

  • 传引用

    真正的以地址的方式传递参数
    传递以后,行参和实参都是同一个对象,只是他们名字不同而已
    对行参的修改将影响实参的值

四、尽量使用引用来传递参数

  • 尽量使用const来保护引用
  • 尽量使用引用来代替指针
  • 以上均用代码实现。
#include<iostream>
using namespace std;
void wget(const int &dwA)
{
	cout <<"引用"<<"-->"<< dwA << endl;
}
int main()
{
	int dwA = 1;
	wget(dwA);
	return 0;
}

五、学习题:

函数可以返回任何类型的引用
如果返回的引用对应于一个局部变量,会有什么问题,并用代码
展示。

[]: https://blog.csdn.net/weixin_40539125/article/details/81410008?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1 “C/C++ 引用作为函数的返回值”

#include<iostream>
using namespace std;
int& wget(int a)
{
	a = 1;
	return a;
}
int main()
{
	int b = wget(3);
	cout << "返回引用" << "-->" << b << endl;
	int& c = wget(3);
	cout << "函数返回的引用作为新引用的初始化值" << "-->" << c << endl;
	return 0;
}

结果并不是那么理想,so why?
运行结果基于vs2019

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值