1,数组指针语法梳理

回顾,如何定义数组数据类型:

回顾,如何定义指针类型数组:

回顾,如何直接定义 一个指向数组类型的指针:

2,函数指针语法梳理

1)如何定义一个函数类型

2)如何定义一个函数指针类型

3)如何定义一个函数指针(指向一个函数的入口地址)




【中级程序员 转 高级程序员的 必经之路】

1,函数类型做函数的参数

把函数的入口地址传过来,奇怪的效果:【多态就是这样】

函数指针 做 函数参数 思想剖析



1,数组指针语法梳理

回顾,如何定义数组数据类型:


chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;

int main()
{
	typedef int (arr) [5];	//定义一种数据类型
	arr myarr;		//用数据类型,定义变量
	myarr[3] = 10;		//使用
	cout << myarr[3] << endl;
	int a[5];		//等同于这样写
		
	return 0;
}

chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp  && ./run 
10
chunli@http://990487026.blog.51cto.com~/c++$


回顾,如何定义指针类型数组:


chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;

int main()
{
	typedef int (*arr) [10];	//定义一种数据类型
	arr my_arr;			//用数据类型申明一个变量
	int a[10];			//常规的数组
	my_arr = &a;			//区地址给我
	(*my_arr)[0] = 9999;
	cout << *((*my_arr) +0) << endl;

	return 0;
}

chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp  && ./run 
9999
chunli@http://990487026.blog.51cto.com~/c++$



回顾,如何直接定义 一个指向数组类型的指针:


chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;

int main()
{
	int arr[10];
	int (*p)[10];
	p = &arr;
	(*p)[2] = 10;
	cout << *(*(p) + 2)<< endl;
	return 0;
}

chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp  && ./run 
10
chunli@http://990487026.blog.51cto.com~/c++$


2,函数指针语法梳理

1)如何定义一个函数类型

2)如何定义一个函数指针类型

3)如何定义一个函数指针(指向一个函数的入口地址)


1,函数的基本调用:


chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;

int add(int a,int b)
{
	return a + b;
}

int main()
{
	int sum = add(1,2);	//函数名,就是函数的入口地址
	cout << sum <<endl;
	return 0;
}

chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp  && ./run 
3
chunli@http://990487026.blog.51cto.com~/c++$


1)如何定义一个函数类型

使用函数指针,间接调用函数


chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;

int add(int a,int b)
{
	return a + b;
}

int main()
{
	typedef int (fun)(int a,int b);	//定义一种fun的函数类型
	fun *p = NULL;			//定义一个变量
	p =  &add;			//把返回值,参数类型完全一样的函数地址,给我
	p =  add;                       //这样写,兼容C历史
	int sum = p(1,6);
	cout << sum <<endl;
	return 0;
}

chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp  && ./run 
7
chunli@http://990487026.blog.51cto.com~/c++$


2)如何定义一个函数指针类型


chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;

int add(int a,int b)
{
	return a + b;
}

int main()
{
	typedef int (*fun)(int a,int b);//定义一种fun的函数类型
	fun p = NULL;			//定义一个变量
	p =  add;			//这样写,兼容C历史
	int sum = p(1,6);
	cout << sum <<endl;
	return 0;
}

chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp  && ./run 
7
chunli@http://990487026.blog.51cto.com~/c++$





3)如何定义一个函数指针(指向一个函数的入口地址)


chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;

int add(int a,int b)
{
	return a + b;
}

int main()
{
	int (*fun)(int a,int b);	//定义一个变量
	fun =  add;		
	int sum = fun(1,6);
	cout << sum <<endl;
	return 0;
}

chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp  && ./run 
7
chunli@http://990487026.blog.51cto.com~/c++$


【中级程序员 转 高级程序员的 必经之路】


1,函数类型做函数的参数

准备:


chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
typedef int (*fun)(int a,int b);	//定义一种数据类型

int add(int a,int b)
{
	return a + b;
}


int main()
{
	fun f = NULL;			//使用数据类型,定义一个变量
	f = &add;			//给变变量赋值
	cout << f(1,2) << endl;
	return 0;
}

chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp  && ./run 
3
chunli@http://990487026.blog.51cto.com~/c++$



chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
typedef int (*fun)(int a,int b);	//定义一种数据类型

int add(int a,int b)
{
	return a + b;
}

//下面的这两种方式的是一样的
int chunli_1(fun f)
{
	return f(3,5);
}
int chunli_2( int (*fun)(int a,int b))
{
	return fun(2,3);
}

int main()
{
	cout <<  chunli_1(add)<< endl;
	cout <<  chunli_2(add)<< endl;
	return 0;
}

chunli@http://990487026.blog.51cto.com~/c++$ !g
g++ -g -o run main.cpp  && ./run 
8
5
chunli@http://990487026.blog.51cto.com~/c++$




把函数的入口地址传过来,奇怪的效果:【多态就是这样】


chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
typedef int (*fun)(int a,int b);	//定义一种数据类型

int add1(int a,int b)
{
	cout << "add1 函数被调用 \n";
	return a + b;
}
int add2(int a,int b)
{
	cout << "add2 函数被调用 \n";
	return a + b;
}
int add3(int a,int b)
{
	cout << "add3 函数被调用\n";
	return a + b;
}
int add4(int a,int b)
{
	cout << "add4 函数被调用\n";
	return a + b;
}

//下面的这两种方式的是一样的
int chunli_1(fun f)
{
	return f(3,5);
}
int chunli_2( int (*fun)(int a,int b))
{
	return fun(2,3);
}

int main()
{
	cout <<  chunli_1(add1)<< endl;
	cout <<  chunli_2(add2)<< endl;
	cout <<  chunli_2(add3)<< endl;
	cout <<  chunli_2(add4)<< endl;
	return 0;
}

chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp  && ./run 
add1 函数被调用 
8
add2 函数被调用 
5
add3 函数被调用
5
add4 函数被调用
5
chunli@http://990487026.blog.51cto.com~/c++$



函数指针 做 函数参数 思想剖析

wKiom1d-F7ajpEOXAAGHMXGPX_k665.jpg