C语言——指针数组,数组指针,函数指针,函数指针数组
众所周知,指针是一个地址,也是用于存储数据地址,通常说的指针是一个指针变量。在内存中,指针在32(x86)位系统中占用4个字节,在64位系统中是占用8个字节。学习C语言不可避免的会使用指针,比如我们常常说的函数调用的方式:传址调用,传值调用。其中的传址调用,用于接收数据的就是指针。
指针数组
指针数组——用于存放指针的数组
如:
char *p1="hello!";
char *p2="world";
char *arrp[10]={p1,p2};
此时的arrp就是指针数组,含义就是可以存放10个char*指针。当你要使用其中的指针时,可以直接使用下标的方法。因为是数组,只能存放相同类型的指针。
数组指针
数组指针——一个指向数组的指针。
如:
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int(*p)[10]=&arr;
此时的p就是数组指针,他也可以用于打印数组每个数据。
int arr[]={1,2,3,4,5,6,7,8,9,10};
int(*p)[10]=&arr;//数组指针
int sz=sizeof(arr)/sizof(arr[0]);
int i=0;
for(i=0;i<sz;i++)
{
printf("%d ",(*p)[i]);//此时的p是整个数组
}
还有很多可以使用数组指针的项目,数组传参可以利用数组指针。
函数指针
函数指针——一个指向函数的指针
如:
int Add(int x,int y)
{
return x+y;
}
int main()
{
int *p(int ,int)=&Add;
int *p1(int x,int y)=Add;
printf("%d\n",p(3,5));
return 0;
}
在以上的函数中 p 等价于 p1 都是函数指针,他们括号里的参数可以省略,参数类型不能省略!函数名和取地址函数名是一样的,所以在函数前加不加取地址符号&也可以同样代表函数地址。
函数指针数组
函数指针数组——用于存储函数指针的数组
如;
函数指针——一个指向函数的指针
如:
int Add(int x,int y)
{
return x+y;
}
int Sub(int x,int y)
{
return x-y;
}
int main()
{
int *p(int ,int)=&add;
int *p1(int ,int)=⋐
int(*parr[2])(int ,int)={p,p1};
return 0;
}
parr 就是函数指针数组,当去掉parr 时int(*)(int ,int),就是该数组的类型,返回型是int。可以利用函数指针数组来实现一个简易计算机,包括,加,减,乘,除,左移位,右移位,按位与,按位或,按位异或,这9种运算。
//action
#include<stdio.h>
void menu()
{
printf("-------------------------\n");
printf("| 0.退出 1.加 |\n");
printf("| 2.减 3.乘 |\n");
printf("| 4.除 5.左位移 |\n");
printf("| 6.右位移 7.按位与 |\n");
printf("| 8.按位或 9.按位异或|\n");
printf("----------------------\n");
}
int Add(int x, int y)
{
return x + y;
}
int Sex(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 left(int x, int y)
{
return x << y;
}
int right(int x, int y)
{
return x >> y;
}
int move_and(int x, int y)
{
return x | y;
}
int move_or(int x, int y)
{
return x & y;
}
int and_or(int x, int y)
{
return x ^ y;
}
int main()
{
int input = 0;
do {
menu();
printf("please input way:>");
scanf("%d", &input);
int(*parr[10])(int, int) = { 0, Add, Sex, Mul, Div, left, right, move_and, move_or, and_or };
if (input == 0)
{
printf("退出\n");
break;
}
else if (input >= 1 && input < 10)
{
printf("请输入两个操作数:>");
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
printf("%d\n", (*parr[input])(x, y));
}
else
printf("输入错误\n");
} while (input);
return 0;
}
今天的分享就到这里,其实使用函数指针数组的方法有很多,值得你一一去探索。