1.函数指针与指针函数
直接看最后直接就懂了
1.1 函数指针
参考链接:link
程序中定义的函数,程序在编译时会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址,即函数指针;
函数名就是一个指针,指向函数的代码,既可以作为函数调用,也可以作为参数传递(回调函数)
// 定义一个函数实现
int Max(int x, int y) //定义Max函数
{
int z;
if (x > y) {
z = x;
}
else {
z = y;
}
return z;
}
int main(){
int (*p)(int,int); // 定义一个函数指针
int a = 1, b = 2, c = 5;
p = Max; // 赋值Max -> p
c= p(a,b); // 等价于 Max(a,b);
printf("%p %p", p, Max); // 指针地址是相同的
return 0;
}
1.2 指针函数
返回值为指针的函数
int * Max2(int x, int y)
{
int *temp = new int;
if (x > y) {
*temp = x;
}
else {
*temp = y;
}
return temp;
}
int main(){
auto data = Max2(1, 2);
printf("%d %p\n", *data, data);
delete data;
data = nullptr;
}
2. 函数模板与模板函数
2.1 函数模板
函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。
template <typename T>
void swap(T *a, T *b) {
T temp = *a;
*a = *b;
*b = temp;
}
template <class Type>
Type min(Type a, Type b)
{
return a < b ? a : b;
}
int main() {
int a = 10, b = 15;
swap<int>(&a, &b);
printf("%d %d \n", a, b);
swap(&a, &b);
printf("%d %d \n", a, b);
return 0;
}
2.2 模板函数
函数模板的类型形参实例化后就是模板函数, 函数模板是作为模板,而对模板的具体使用就叫模板函数
3.指针数组与数组指针
参考链接:link
3.1 指针数组
本质是数组,数组里面存放的内容是指针
int *data[n];
// 赋值
int *p[3];
int a[3][10];
p++; // p[1]; 存的是下一个指针
for(int i=0;i<3;++i){
p[i] = a[i]; // p = {a[0],a[1],a[2]};
}
3.2 数组指针(行指针)
本质是指针, 指针指向数组
int (*p)[n];
// 赋值
int a[3][10];
int (*p)[10]; // 指向一个含有四个元素的一维数组的数组指针
p=a; // p =a[0] // 数组名即数组的首地址
p++; a[1]
4 豁然开朗
函数指针 = 指向函数的指针
指针函数=返回指针的函数
数组指针=指向数组的指针
指针数组=内容是指针的数组
类模板=用来产生类的模板
模板类=使用类模板产生的类
函数模板=用来产生函数的模板
模板函数=使用函数模板产生的函数