在C++中,函数声明形式为:返回值 函数名称(参数类型 参数名称, 参数类型 参数名称)
其中参数名称可以省略不写,记得最后加分号!
定义函数指针和函数声明有些类似,但有一点不同,在函数指针中,函数名为一个指针变量,如下例子中的(*p[2])为一个函数指针数组, 其中p[0] = &max, 相当于对max函数取别名!
#include<iostream> #include<vector> using namespace std; int max(int a, int b) { return (a < b) ? b : a; } int add(int a, int b) { return a + b; } int main() { int (*p[2])(int, int); // 定义函数指针 int a, b, c; int res1, res2; int max(int, int); // 函数声明 p[0] = &max; p[1] = &add; cin >> a >> b >> c; res1 = (*p[0])((*p[0])(a, b), c); cout << res1 << endl; res2 = (*p[1])((*p[1])(a, b), c); cout << res2 << endl; system("PAUSE"); return 0; }
那在C++中,动态内存如何进行传递呢?
在下面例子中,其中GetMemory1函数中出现了指针作为函数参数进行传递的形式!而指针传递和其他非引用传递一样,都会将实参拷贝出来一份进行传递,因此在函数中形参改变,而实参不改变!
解决这个问题的方法有三种:
-
使用指针的指针,char **p
-
在C++中有了引用的符号,因此也可以对指针类型进行引用传递,char* &p
-
可以利用函数返回值来进行传递(注意返回值是在堆区还是栈区!)
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> using namespace std; //char* GetMemory0(int num) { // char p[20]; // return p; //} 写法错误,返回的是堆栈地址,而堆栈地址在函数结束后会销毁 //void GetMemory1(char* p, int num) { // p = (char*)malloc(sizeof(char) * num); //} 这种写法错误,指针传递属于非引用传递,故函数内指针实为拷贝后完全不同的指针 void GetMemory2(char** p, int num) { *p = (char*)malloc(sizeof(char) * num); } void GetMemory3(char* &p, int num) { p = (char*)malloc(sizeof(char) * num); } char* GetMemory4(int num) { char* p = (char*)malloc(sizeof(char) * num); return p; } int main() { char* str1 = nullptr; // 创建指针必须初始化 GetMemory2(&str1, 20); strcpy(str1, "HELLO"); cout << str1 << endl; free(str1); str1 = nullptr; // 指针free后要置空,防止出现野指针 system("PAUSE"); return 0; }