函数与指针

  • void (*p)()=0x10510b9;//函数指针,地址为要调用函数的地址
    p();//调用

  • 函数指针变量,在数据区,但是存储了代码区的地址,函数在代码区

  • int (*p)[5]; 指向数组的指针,占四个字节
    int *p[5];是一个数组,每一个元素是一个指针

  • 栈分配内存
    int *p=alloca(sizeof(int)* 10);
    alloca分配内存后自动释放内存

函数指针数组

int(*p [6])(int a, int b) = { getmax, getmin, add, sub, mul, divv };

p是函数指针数组名int(*p [6])(int a, int b) ,等价于二级函数指针 int(**pp)(int, int)

堆上函数指针

void main3()  
{  
    int(**pp)(int, int) = malloc(sizeof(int(*)(int, int)) * 4);//堆区  
    *pp = add;  
    *(pp + 1) = sub;  
    *(pp + 2) = mul;  
    *(pp + 3) = divv;  
  
    for (int i = 0; i < 4; i++)  
    {  
        //  printf("%d\n", pp[i](100, 10));  
        printf("%d\n", (*(pp + i))(100, 10));  
    }  
  
  
    system("pause");  
  
}  

简单函数指针

```
#include <stdio.h>
#include <stdlib.h>

int add(int, int);


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

int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int divv(int a, int b)
{
	return a /b;
}

int  getmax(int a, int b)
{
	return a > b ? a : b;
}

int  getmin(int a, int b)
{
	return a < b ? a : b;
}
void op(  int (*p)(int,int)  ,int a,int b  )
{
	printf("%d\n", p(a, b));

}

void main2()
{
	op(add, 1, 2);

	op(divv, 1, 2);


	system("pause");
}
```

返回值为函数指针

void main1()  
{  
    int(*p1)(int a, int b)=add(1,2);  
    int(*p2)(int, int)=add;//参数名可以省略  
    p1(1, 2);  
    //p1++;  函数指针没有自增,自建  
    //p2++;  
    //p3 + n;  
  
}  
//int(*p)(int, int)函数指针  
//int(*)(int, int) 函数指针类型  
//int(* get() )(int, int)  //一个函数,参数为空,返回值是一个函数指针  
//  
  
//   int(    * get(int (*y)(int,int),double)         )(int, int)   
// int(    *         )(int, int) //函数指针类型  
//  get(  int (*y)(int,int)   ,    double)   整体  
  
int(* getop())(int, int)  
{  
    return add;  
}  

void main()  
{  
    printf("%d", getop()(1, 2));  
  
    system("pause");  
}  

函数指针数组

#include <stdio.h>
#include <stdlib.h>

int  getmax(int a, int b)
{
	return a > b ? a : b;
}

int  getmin(int a, int b)
{
	return a < b ? a : b;
}

int  add(int a, int b)
{
	return a + b;
}
int  sub(int a, int b)
{
	return a - b;
}
int  mul(int a, int b)
{
	return a * b;
}
int  divv(int a, int b)
{
	return a /b;
}


void main()
{
	//int a
	//int a[10]
	//int *p
	//int **pp
	//int  (*p)(int a, int b)=getmax;
	int(*p [6])(int a, int b) = { getmax, getmin, add, sub, mul, divv };
	//p是函数指针数组名int(*p [6])(int a, int b) ,等价于二级函数指针  int(**pp)(int, int)
	printf("%d", sizeof(p));
	//p = p;//p是一个常量

	for (int i = 0; i < 6;i++)
	{
		//printf("\n%d", p[i](100,10));//p[i]代表函数指针
		printf("\n%d",(*(p+i))(100, 10));//*(p+i)  p[i]等价
	}

	for (int(**pp)(int, int) = p; pp < p + 6;pp++)
	{
		printf("\n%d",(*pp)(100, 10));
	}
	//int(*p)(int, int)
	//int(*p[6])(int a, int b)
    // int(**pp)(int, int) //必须在前面一个小括号

	//int a;
	//int a[10];
	//int *a
	// int *p1;
	//int *p1[10];
	//int **p1;

	system("pause");
}


void  main2()
{
	//int a[6] = { 1, 2, 3, 4, 5, 6 };
	//int(*p[6])(int a, int b) = { getmax, getmin, add, sub, mul, divv };
	//a,p都属于常量
	//int *pa = (int[]){ 1, 2, 3, 4, 5, 6 };//栈上开品

	//int(**pp)(int, int)二级函数指针,存储函数指针数组名
	//int(*[])(int, int)函数指针数组类型
	int(**pp)(int, int) = (  int(*[])(int, int)   ){ add, sub, mul, divv };
	for (int i = 0; i < 4; i++)
	{
	//	printf("%d\n", pp[i](100, 10));
		printf("%d\n", (*(pp+i))(100, 10));
	}





	system("pause");
}

void main3()
{
	int(**pp)(int, int) = malloc(sizeof(int(*)(int, int)) * 4);//堆区
	*pp = add;
	*(pp + 1) = sub;
	*(pp + 2) = mul;
	*(pp + 3) = divv;

	for (int i = 0; i < 4; i++)
	{
		//	printf("%d\n", pp[i](100, 10));
		printf("%d\n", (*(pp + i))(100, 10));
	}


	system("pause");

}

//int *p          int (*p)(int,int )
//int *p[10]       int (*p[10])(int,int )
//int **p          int (**p)(int,int )  //左边小括号

//typedef 
//int  a;
typedef  int  a;
//int  b[10];
typedef int  b[10];
//double *d 
typedef double *d;
//int(*p)(int, int);
typedef  int(*p)(int, int);
//int(*p[10])(int, int);
typedef int(*px[10])(int, int);
//int(**pp)(int, int);
typedef  int(**pp)(int, int);
//typedef简化书写
//先定义变量,类型+变量名
//typedef类型+变量名
//变量名就是类型的别名

void  main()
{
	a a1;
	b b1;
	d d1;
	p p1 = add;
	px px1 = { add, sub, mul, divv };
	pp pp1 = (px){ add, sub };

	printf("%d", sizeof(px1));

	system("pause");
}
//int (**          x(int (*z)(int ,int),int,double)       )(int);
//int (**                  )(int)  //函数返回值类型
//Z  x(  int (*z)(int ,int),   int,     double)

//x的返回值二级函数指针,参数,有一个函数指针,int,double, 
//x是一个函数
//z函数指针

//int  (*p)[5];//指向数组的指针
//int *p[5];//数组,每一个元素是一个指针

//int( *p[5])(int, int);//函数指针数组
//int( (*(p))[5])(int, int);//指针指向函数指针数组

void main()
{
//	int(*   p[5]  )(int a, int b); 
	int(* (*p)[5])(int a, int b);//指向函数指针数组的指针
}

函数指针数组与多线程

#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <Windows.h>

void run1(void*p)
{
	MessageBoxA(0, "1", "1", 0);
}
void run2(void*p)
{
	MessageBoxA(0, "2", "2", 0);
}
void run3(void*p)
{
	MessageBoxA(0, "3", "3", 0);
}





void main()
{
	//run1(NULL);
	//run2(NULL);
	//run3(NULL);
	//for (int i = 0; i < 3;i++)
	//{
	//    HANDLE hd=	_beginthread(run1, 0, NULL);
	//	//WaitForSingleObject(hd, INFINITE);//无限等待
	//	WaitForSingleObject(hd, 3000);//3000等待3秒
	//}
	//HANDLE hd[3] = { 0 };
	HANDLE *hd = malloc(12);
	//void(*pfun[3])(void*p) = { run1, run2, run3 };//函数指针数组
	void(**pfun)(void*p) = (void(*[3])(void*p)){ run1, run2, run3 };

	for (int i = 0; i < 3;i++)
	{

		hd[i] = _beginthread(pfun[i], 0, NULL);
	}
	//TRUE等待所有线程,fause等待一个
	WaitForMultipleObjects(3, hd, FALSE, INFINITE);//等待多个线程结束

	//

	//主线程,控制全局,

	//system("pause");



}
//线程可以同步,也可以异步
//WaitForSingleObject(hd, 3000);//3000等待3秒
//主线程,控制全局  
//WaitForMultipleObjects(3, hd, TRUE, INFINITE);//

函数返回值副本机制

  • 函数返回指针的时候,不可以返回指针指向栈区的内存,要获取指针函数返回值,该函数必须在堆上开辟内存

  • 普通在栈上的函数返回值有副本机制,存储在cpu,所以不能对其取地址等操作

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    char * get()
    {
    	char str[100] = { 0 };//内存栈区
    	strcpy(str, "hello zhourifu");//拷贝字符串作用
    	printf("%s\n", str);
    	return str;
    
    }
    
    void main2()
    {
    	char *p = get();
    	printf("%s", p);//函数的返回指针的时候,不可以返回指向栈区的内存
    	system("pause");
    
    }
    
    void main()
    {
    	char str[100] = { 0 };//数组
    	strcpy(str, "hello zhourifu");//拷贝字符串作用
    	printf("%s", str);//遇到'\0'
    
    }
    
    int * rungetmin()
    {
    	int *p = calloc(10, sizeof(int));//不会自动释放
    	time_t ts;
    	unsigned int num = time(&ts);//地址改变数据
    	srand(num);
    	for (int i = 0; i < 10;i++)
    	{
    		p[i] = rand() % 100;
    		printf("\n%d", p[i]);
    	}
    	int imin = 0;//下标
    	for (int i = 1; i < 10;i++)
    	{
    		if (p[i]<p[imin])
    		{
    			imin = i;//记录下标
    		}
    	}
    	// p + imin   &p[imin]
    	//*(p+imin)  p[imin]
    	return p + imin;
    }
    
    
    
    void   main10()
    {
    
    	printf("最小的是%d", *rungetmin());
    	system("pause");
    }
    
posted @ 2016-11-18 21:06  呉语伦比  阅读(131)  评论(0)    收藏  举报