函数与指针
-
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"); }

浙公网安备 33010602011771号