一、下列是危险的指针用法,请用代码演示
1.使用NULL指针的内容
#include<iostream>
using namespace std;
int main()
{
int* p = NULL;
cout << "p 的值是 " << p;
return 0;
}
2.使用没有初始化的指针变量
#include<iostream>
using namespace std;
int main()
{
int* p;
cout << p << endl;
return 0;
}
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;
}
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;
}
二、一个交换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;
}
三、函数的形参可以是引用
- 通过引用来传递参数,请分别用代码实现值传递,引用传递,地址传递,并比较优缺点
值传递
#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?