C语言指针进阶34一二级指针传参函数指针函数指针数组-创新互联
一级指针传参
名称栏目:C语言指针进阶34一二级指针传参函数指针函数指针数组-创新互联
文章出自:http://azwzsj.com/article/ipeij.html
void print(int* arr, int sz)
{int i = 0;
for (i = 0; i< sz; i++)
{printf("%d", *(arr + i));
}
}
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10 };
int* p = arr;//数组名是首元素地址
int sz = sizeof(arr) / sizeof(arr[0]);
print(arr, sz);
return 0;
}
void print(int* arr, int sz)
{int i = 0;
for (i = 0; i< sz; i++)
{printf("%d", *(arr + i));
}
}
void test1(char* p)
{}
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10 };
int* p = arr;//数组名是首元素地址
int sz = sizeof(arr) / sizeof(arr[0]);
char ch = 'w';
test1(&ch);
char* p1 = &ch;
test2(p1);
print(arr, sz);
return 0;
}
二级指针传参void test(int** ppa)
{**ppa = 20;
}
int main()
{int a = 10;
int* pa = &a;
int** ppa = &pa;
test(ppa);
printf("%d", a);
return 0;
}
当函数参数为二级指针的时候,可以接收什么参数
创新互联建站总部坐落于成都市区,致力网站建设服务有成都网站建设、成都做网站、网络营销策划、网页设计、网站维护、公众号搭建、微信小程序开发、软件开发等为企业提供一整套的信息化建设解决方案。创造真正意义上的网站建设,为互联网品牌在互动行销领域创造价值而不懈努力!void test(int** ppa)
{**ppa = 20;
}
int main()
{int a = 10;
int* pa = &a;
int** ppa = &pa;
test(ppa);
test(&pa);//传一级指针变量的地址
int* arr[10] = {0 };
test(arr);//传存放一级指针的数组
printf("%d", a);
return 0;
}
函数指针int Add(int x, int y)
{return x + y;
}
int main()
{int a = 0;
int* pa = &a;
char ch = 'w';
char* pc = &ch;
int arr[10] = {0 };
int(*parr)[10] = &arr;//去除数组地址
//parr是指向数组的指针 存放的是数组的地址
//函数指针 存放函数地址的指针
//&函数名 取得就是函数的地址
//函数指针存起来 创建一个变量pf
int (*pf)(int, int) = &Add;
printf("%d", &Add);
printf("%d", Add); //结果一样 函数名==&函数名
return 0;
}
练习
void test(char* str)
{}
int main()
{ void(*pt)(char*) = &test;
return 0;
}
如何解引用使用
int Add(int x, int y)
{return x + y;
}
int main()
{int (*pf)(int, int) = &Add;
int ret = (*pf)(3, 5);
printf("%d", ret);
//要是直接写int ret = add(3, 5); 会重新在栈区开辟一块空间,但是通过指针调用就不会开辟那么多。节省内存的使用
return 0;
}
int Add(int x, int y)
{return x + y;
}
int main()
{int (*pf)(int, int) = &Add; //&Add==add==pf
int (*pf)(int, int) = Add;
int ret = pf(3, 5);//得出*是摆设 随便写几个都没影响
int ret = Add(3, 5);
int ret = (*pf)(3, 5);
printf("%d", ret);
//要是直接写int ret = add(3, 5); 会重新在栈区开辟一块空间,但是通过指针调用就不会开辟那么多。节省内存的使用
return 0;
}
4(void(*)())0 把0强制类型转换为函数指针类型
*(void(p)())0 只是函数指针变量
((void()())0)解引用调用这个函数,相当于找到这个0地址函数因为放的无参 解引用调用后是不用传参((void()())0)();
简易写法
//函数指针数组 存放函数的指针数组
//
//整形指针int*
//整形指针数组 int*arr[5]
int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x -y;
}
int main()
{int (*pf1)(int, int) = Add;
int (*pf2)(int, int) = Sub;
int (*pfArr[2])(int, int) = {Add,Sub}//这就是函数指针数组 2是准备放的元素可以随意更改 后边大括号初始化
return 0;
}
如何使用如下
int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x -y;
}
int Mul(int x, int y)
{return x * y;
}
int Div(int x, int y)
{return x / y;
}
void menu()
{printf("******************************\n");
printf("******1.add 2.sub ******\n");
printf("******3.mul 4.div ******\n");
printf("****** 0.exit ******\n");
printf("******************************\n");
}
int main()
{int input = 0;
//计算器 计算整型变量的加减乘除
do
{menu();
int x = 0;
int y = 0;
int ret = 0;
printf("请选择");
scanf("%d", &input);
switch (input)
{case 1:
printf("请输入两个操作数\n");
scanf("%d %d", &x, &y);
ret=Add(x, y);
printf("ret=%d\n", ret);
break;
case 2:
printf("请输入两个操作数\n");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("ret=%d\n", ret);
break;
case 3:
printf("请输入两个操作数\n");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
printf("ret=%d\n", ret);
break;
case 4:
printf("请输入两个操作数\n");
scanf("%d %d", &x, &y);
ret = Div(x, y);
printf("ret=%d\n", ret);
break;
case 0:
printf("退出程序");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
普通使用c语言实现简易计算器 由此可见代码冗余 我们可以用我们刚刚学的函数指针数组实现 怎么实现见下篇
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
名称栏目:C语言指针进阶34一二级指针传参函数指针函数指针数组-创新互联
文章出自:http://azwzsj.com/article/ipeij.html