博客文章

数组指针和函数指针

作者: andy.      时间: 2016-07-19 00:07:23

无能送你锦绣荣华,一同老去也算风雅。

好了,装逼完成,开始正式内容。函数指针和数组指针的挺像的,先说说数组类型的定义和其指针。

先看看简单的数组类型的定义和使用,这只是简单的语法上的理解,没什么难点。看一个例子就行了。

#include <stdio.h>
 
typedef int(MyIntArray)[10];
void main(){
        int i = -1;
        MyIntArray array1;
        for(i = 0; i < 10; i++)
                array1[i] = i + 1;
        printf("array[5]:%d\n", array1[5]);
 
        int array2[10];
        MyIntArray* pointer = &array2;
        (*pointer)[5] = 5;
        printf("*pointer[5]:%d\n", (*pointer)[5]);
}

看运行结果:

array[5]:6
*pointer[5]:5

没什么要讲的,需要注意的是这两句:

int array2[10];
MyIntArray* pointer = &array2;

数组名称其实就是数组的首地址,为什么要取地址赋值给MyIntArray指针呢。很简单,MyIntArray定义的是一个在栈上面,有10个元素的数组,而这里如果直接用MyIntArray定义一个变量,将array2赋值给他明显不合法。所以只有定义一个MyIntArray指针,将array2取地址赋值给其变量使用。这样的话pointer其实是一个步长为10*size(int)。有兴趣可以测一下。


下面说函数指针,个人觉得函数指针也是语法级别的难度,直接看代码就好了:

#include <stdio.h>
 
int Add(int, int);
typedef int MyAdd(int, int);
void main(){
       MyAdd* myAdd1 = Add;
       int result = myAdd1(1, 2);
       printf("%d\n", result);
       int (*myAdd2)(int,int) = &Add;
       result = myAdd2(3, 4);
       printf("%d\n", result);
} 
 
int Add(int a, int b){
       return a + b;
}

  看运行结果:

3
7

直接定义了一个函数指针就完了~

看typedef,定了一个返回int,参数为两个int的函数。直接函数指针指向函数就行了。但是注意MyAdd* myAdd1 = Add;和int (*myAdd2)(int,int) = &Add;一个对函数取地址了,一个并没有取地址,这不坑爹么?这就是一个坑~两个并没有区别。

函数指针最大的作用应该是做回调的时候用的,类似于C#中委托。比如:调用dll里面的函数的时候,传入一个外面写的函数,调用的函数就可以执行外面传入的函数,非常有意义。

比如这儿,我有一个数据,需要处理,而处理函数是由他人完成的,封装在dll中,而有时候我又需要在别人对数据处理后进行额外的处理。就需要用到函数指针。看下面的代码。

其中dll中的处理函数为:

#include "Header.h"

typedef int(*ExtrenProccess)(int*);
__declspec(dllexport)
int Proccess(int a, int b, ExtrenProccess extrenProccess) {
	int result = a*b;
	if (extrenProccess)
		return extrenProccess(&result);
	return result;
}

而我这边的调用为:

头部为:

#ifndef _TEST_FUC_POINTER_
#define _TEST_FUC_POINTER_
typedef int(*ExtrenProccess)(int*);
int Proccess(int a, int b, ExtrenProccess extrenProccess);
#endif // !_TEST_FUC_POINTER_

主函数为:

#include <stdio.h>
#include "Header.h"

#pragma comment(lib, "test.lib")

int Test(int* result) {
	return *result >> 1;
}
void main() {
	printf("%d\n", Proccess(3, 4, Test));
}

就完成了上诉的任务。

比如一段数据要处理并进行加密,而加密的函数是不定的,需要从另外一个dll中导出并传入进行回调进行处理。这就显得很重要了。这里叙述不出其重要性~就像多态、接口等等,小程序完全体现不出这些概念的优点。