指针数组:存放指针的数组
p与[]结合为一个数组,数组里存放的是整形指针,这个指针类型为int* 。
int a = 1;
int* p = &a;
int* p[10] ;
数组指针:指向数组的指针或者存放数组的地址的指针
先定义初始化一个整型数组,取出数组的地址,存放在一个指针变量里。
*与p结合为指针。
int arr[3]={0};
int (*p)[3]=&arr;
该指针类型为int(*)[3]。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void print1(int arr[3][5], int x, int y)
{
int i = 0;
int j = 0;
for(i=0; i<x; i++)
{
for(j=0; j<y; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void print2(int(*p)[5], int x, int y)
{
int i = 0;
int j = 0;
for(i=0; i<x; i++)
{
for(j=0; j<y; j++)
{
//printf("%d ", (*(p+i))[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};
int (*p)[3][5] = &arr;
p+1;
print1(arr, 3, 5);
print2(arr, 3, 5);
//数组名是首元素的地址
return 0;
}
上面的代码是函数指针的应用场景。
函数指针:指向一个函数的指针或者存放一个函数地址的指针
int Add(int x,int y);
int (*p)(int,int)=&Add;
该指针的类型为int(*)(int ,int)。
#define _CRT_SECURE_NO_WARNINGS 1
#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;
if(y==0)
{
printf("输出错误\n");
}
}
int Div(int x, int y)
{
return x/y;
}
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("ret = %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 (*pArr[5])(int,int);
int (*(*p[5]))(int,int)=&pArr[5];
该函数的类型为int(*(*)[5])(int,int)
。
指针知识的再扩展:
(1)void((void(*)())0)();(出自《剑指offer》)
这是一个函数调用,含义:把0强制类型转换成一个指针类型,再解引用操作通过函数指针指向的那个函数地址找到那个函数,传参去调用,参数为空。
(2)void (signal(int, void()(int)))(int);(也出自《剑指offer》)
这是一个函数声明,含义:signal是一个函数名,signal这个函数有两个参数,第一个参数类型是int,第二个参数类型是一个函数指针类型,这个函数指针指向的函数的返回值为void,参数为int,这个函数的返回值类型也是一个函数指针类型,这个函数指针的返回值类型为void,参数为int。
关于指针的其他我会在后面的博客继续补充,由于本人刚开始接触指针,所以总结的还不是很到位,希望看到这篇博客的朋友们可以加以补充并且纠正我的错误。