C++学习笔记十五之函数与指针

246 阅读2分钟

函数与指针

指针函数与函数指针

  • 指针函数:函数的返回值指针类型
  • 函数指针:指向函数指针
    • 函数返回值类型 (*指针变量名)(形参表);

函数返回值类型为指针或者引用类型时

  • 不能返回栈区的内存地址变量
  • 函数的返回值为引用类型时,函数调用可以作为左值

练习代码

//指针函数
int* GetMemory()
{
	int *p = new int;
	return p;//返回堆区的内存地址
}
int* GetMemory1()
{
	static int n = 100;
	return &n;//返回静态全局的内存
}
char* GetMemory2()
{
	char *pchar = "abcd";
	return pchar;//返回常量区的内存
}
int& GetN()
{
	static int n = 100;
	cout << n << endl;
	return n;//返回值必须是变量名(非栈区)
}
//给一个函数指针类型取别名
typedef void(*PFun)(char*);
//函数指针作为另外一个函数的形参
void test(char *p,PFun p1,char *p2)
{
	cout << p << endl;
	p1(p2);
}
void test(char *p)
{
	cout << p << endl;
}
int main()
{

	test("我去买包烟", test, "帮我买包槟榔");

	//定义一个函数指针
	int* (*pfun)() = nullptr;
	//该指针指向一个函数
	pfun = GetMemory;
	//定义一个大小为10函数指针的数组,该数组中每一个元素都指向一个返回值类型为int型,参数为int*的函数
	int(*pfun1[10])(int*);
	//通过函数指针调用该函数
	int *p2=pfun();
	cout << p2 << endl;

	int n = 10;
	n = GetN();
	cout << n << endl;
	//函数的返回值为引用类型时,函数调用可以作为左值
	GetN() = 20;//把20赋值给静态全局区的变量n
	GetN();

	int *p = GetMemory1();//p为野指针
	if (p != nullptr)
	{
		*p = 10;
		cout << p << endl;
		cout << *p << endl;
	}
	p = GetMemory1();//p为野指针
	if (p != nullptr)
	{
		*p = 20;
		cout << p << endl;
		cout << *p << endl;
	}
	char *pchar = GetMemory2();
	cout << *pchar << endl;
	cout << pchar << endl;

	return 0;
}