1,数组指针
2,函数指针
3,函数指针练习
写一个计算器
使用函数指针后的计算器
4,指向[函数指针数组]的指针
1,数组指针
复制代码
#include<stdio.h>
//数组指针
//int main() {
// char* arr[5] = { 0 };//声明一个指针数组 arr,包含5个元素,每个元素类型为 char*(指向字符的指针)
// char* (*pc)[5] = &arr; //声明一个数组指针 pc,它指向一个包含5个 char* 元素的数组。
//
// char ch = 'w';//声明字符变量 ch,存储字符 'w'(ASCII值119),占用1字节内存。
// char* p1 = &ch;//声明字符指针 p1,初始化为 ch 的地址。
// char** p2 = &p1;//声明二级指针 p2(指向 char* 的指针),初始化为 p1 的地址
// return 0;
//}
//
//int main() {
// int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//规范使用
//int* p = arr;
//int i = 0;
//for ( i = 0; i < 10; i++)
//{
// printf("%d ", *(p + i));
//}
// //不规范使用
// int (*p)[10] = &arr;//数组指针
// int i = 0;
// int sz = sizeof(arr) / sizeof(arr[0]);
// for ( i = 0; i < sz; i++)
// {
// printf("%d ", *(*p + i));//p是指向数组的,*p其实就相当于数组名,数组名又是数组首元素的地址
// //所以*p本质上是数组首元素的地址
// }
// return 0;
//}
//数组指针的正确使用
void print1(int arr[3][5], int r, int c) {
int i = 0;
for ( i = 0; i < r; i++)
{
int j = 0;
for ( j = 0; j < c; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void print2(int (*p)[5], int r, int c) {//int (*p)[5] 此处用的是指向一维数组的指针
int i = 0;
for (i = 0; i < r; i++)
{
int j = 0;
for (j = 0; j < c; j++)
{
//printf("%d ", *(*(p+i)+j));
printf("%d ", p[i][j]);//完全等价
}
printf("\n");
}
}
int main() {
int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
print1(arr, 3, 5);
print2(arr, 3, 5);
return 0;
}
2,函数指针
复制代码
#include<stdio.h>
//数组指针-->指向数组的指针就是数组指针
//函数指针-->指向函数的指针就是函数指针
//int Add(int x,int y) {
// return x + y;
//}
//int main() {
// int arr[5] = { 0 };
// //&数组名 - 取出的数组的地址
// int (*p)[5] = &arr;//数组指针
//
// //&函数名 - 取出的就是函数的地址
// printf("%p\n", &Add);
// printf("%p\n", Add);
// //对于函数来说,&函数名和函数名都是函数的地址
//
// int (*pf)(int, int) = &Add;
// int (*pf)(int, int) = Add;
//
// int ret = (*pf)(2, 3);
// int ret = Add(2, 3);
// int ret = pf(2, 3);
// printf("%d ", ret);
// return 0;
//}
//函数指针应用
int Add(int x, int y) {
return x + y;
}
void calc(int(*pf)(int, int)) {
int a = 3;
int b = 5;
int ret = pf(a, b);
printf("%d\n", ret);
}
int main() {
calc(Add);
return 0;
}
3,函数指针练习
写一个计算器
复制代码
#include<stdio.h>
//函数指针的用途
//写一个计算器
//加 减 乘 除
void menu() {
printf("***********************************\n");
printf("*********1. add 2,sub *********\n");
printf("*********3. mul 4.div *********\n");
printf("*********0. exit *********\n");
printf("***********************************\n");
}
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;
}
int main() {
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
do {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input) {
case 1:
printf("请输入两个数:>");
scanf("%d %d", &x, &y);
ret = Add(x, y);
printf("%d\n", ret);
break;
case 2:
printf("请输入两个数:>");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("%d\n", ret);
break;
case 3:
printf("请输入两个数:>");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
printf("%d\n", ret);
break;
case 4:
printf("请输入两个数:>");
scanf("%d %d", &x, &y);
ret = Div(x, y);
printf("%d\n", ret);
break;
case 0:
printf("退出计算器\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
使用函数指针后的计算器
复制代码
#include<stdio.h>
////使用函数指针后
//void calc(int (*pf)(int, int)) {
// int x = 0;
// int y = 0;
// int ret = 0;
// printf("请输入两个数:>");
// scanf("%d %d", &x, &y);
// ret = pf(x, y);
// printf("%d\n", ret);
//}
//int main() {
// int input = 0;
// do {
// menu();
// printf("请选择:>");
// scanf("%d", &input);
// switch (input) {
// case 1:
// calc(Add);
// break;
// case 2:
// calc(Sub);
//
// break;
// case 3:
// calc(Mul);
//
// break;
// case 4:
// calc(Div);
//
// break;
// case 0:
// printf("退出计算器\n");
// break;
// default:
// printf("选择错误\n");
// break;
// }
// } while (input);
// 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;
//}
//
//int main() {
// int (*pf)(int, int) = Add;//pf是函数指针
// int (*arr[4])(int, int) = { Add,Sub,Mul,Div };//arr就是函数指针的数组
// int i = 0;
// for ( i = 0; i < 4; i++)
// {
// int ret = arr[i](8, 4);
// printf("%d \n", ret);
// }
// return 0;
//}
//计算器再进化
void menu() {
printf("***********************************\n");
printf("*********1. add 2,sub *********\n");
printf("*********3. mul 4.div *********\n");
printf("*********0. exit *********\n");
printf("***********************************\n");
}
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;
}
int main() {
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
int (*pfArr[5])(int, int) = { 0,Add,Sub,Mul,Div };
do {
menu();
printf("请选择:>");
scanf("%d", &input);
if (input==0)
{
printf("退出\n");
}
else if (input>=1&&input<=4)
{
printf("请输入2个操作数:>");
scanf("%d %d", &x, &y);
ret = pfArr[input](x,y);
printf("%d\n", ret);
}
else {
printf("选择错误\n");
}
} while (input);
return 0;
}
4,指向[函数指针数组]的指针
复制代码
#include<stdio.h>
//指向[函数指针数组]的指针
int main() {
//函数指针数组
int (*pfArr[])(int,int) = { 0,Add,Sub,Mul,Div };
//指向[函数指针数组]的指针
int (*(*ppfArr)[5])(int, int) = &pfArr;
return 0;
}