#include <stdio.h>
void print(int *p, int sz)
{
int i = 0;
for(i=0; i<sz; i++)
{
printf("%d\n", *(p+i));
}
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9};
int *p = arr;
int sz = sizeof(arr)/sizeof(arr[0]);
//一级指针p,传给函数
print(p, sz);
return 0;
}
//二级指针
#include <stdio.h>
void test(int** ptr)
{
printf("num = %d\n", **ptr);
}
int main()
{
int n = 10;
int*p = &n;
int **pp = &p;
test(pp);
test(&p);
return 0;
}
5.函数指针
复制代码
int Add(int a,int b)
{
return a+b;
}
int main()
{
int (*pf)(int ,int)=&Add;
int (*pf)(int ,int)=Add;
return 0;
}
//&函数名和函数名都是函数的地址
//pf是一个存放函数的指针变量------函数指针
#指针数组,数组指针,函数指针的区分
复制代码
int main()
{
//指针数组 本质上是数组,里面存放的是指针
char* ch[5]
int arr[10]={0};
//数组指针 本质上是指针,存的是地址
int (*pa)[5]=&arr;
//pf是函数指针
int my_strlen(const char *str)
{
return 0;
}
int (*pf)(const char*)=&my_strlen;
}
6函数指针数组
是用来存放 函数指针 的数组
复制代码
int main()
{
//pf是函数指针
int my_strlen(const char *str)
{
return 0;
}
int (*pf)(const char*)=&my_strlen;
//函数指针数组,那么在函数指针上加个数组呗!
int (*pfA[5])(const char*)={&my_strlen};
}
那么能干什么???
下面是一个简易的计算机小代码:
复制代码
#include <stdio.h>
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 div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
do
{
printf( "*************************\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "*************************\n" );
printf( "请选择:" );
scanf( "%d", &input);
switch (input)
{
case 1:
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = add(x, y);
printf( "ret = %d\n", ret);
break;
case 2:
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = sub(x, y);
printf( "ret = %d\n", ret);
break;
case 3:
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = mul(x, y);
printf( "ret = %d\n", ret);
break;
case 4:
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = div(x, y);
printf( "ret = %d\n", ret);
break;
case 0:
printf("退出程序\n");
breark;
default:
printf( "选择错误\n" );
break;
}
} while (input);
return 0;
}
用函数指针数组改一下
复制代码
#include <stdio.h>
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 div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
//从这开始变化
int(*p[5])(int x, int y) = { 0, add, sub, mul, div };
//这个函数指针数组就像跳转一样就被称为 转移表。
while (input)
{
printf( "*************************\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "*************************\n" );
printf( "请选择:" );
scanf( "%d", &input);
if ((input <= 4 && input >= 1))
{
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else
printf( "输入有误\n" );
printf( "ret = %d\n", ret);
}
return 0;
}
这样就不需要do while循环中的一直case!
7指向函数指针数组的指针
复制代码
int main()
{
int arr[10]; //整型数组
int (*pa)[10]=&arr;
int (*pf[5])(int ,int);
int(*(*ppf)[5](int ,int)=&pf;
//pf是函数指针数组,&pf后,ppf再指向它,那ppf就是指向函数指针数组的指针
}