【c语言】理解指针数组、数组指针、函数指针、函数指针数组、函数指针数组的指针

目录

1.指针数组
2.数组指针
3.函数指针
4.函数指针数组
5.函数指针数组的指针


一、指针数组

1.是一个存放指针的数组
2.举一个栗子

int  *arr[10];
char *arr2[4];
char **arr3[5];

二、数组指针

1.int (*p)[10];
解释:p先和*结合,说明p是一个指针变量,然后指针指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。
注意:[ ]的优先级高于号,所以必须加上()来保证p先和结合。
2.举例

int arr[10] = {0};
int *p1 = arr;//数组首元素的地址
int (*p2)[10] = &arr; //数组的地址放在数组

3.一维数组传参

void test()
{ 
  int arr[10]=0;
  int *arr[20]=0;
  print(arr);
  print(arr2);
}
void print(int arr[])//对
{}
void print(int arr[10])//对
{}
void print(int *arr)//对
{}
void print(int *arr[20])//对
{}
void print(int **arr)//对
{}

4.二维数组传参

void test()
{
  int arr[3][5]={0};
  print(arr);
}
void print(int arr[3][5])//对
{}
void print(int arr[][5])//对
{}
void print(int (*arr)[5])//对
{}
void print(int arr[][])//错
{}
void print(int* arr[5])//错
{}
void print(int *arr)//错
{}
void print(int **arr)//错
{}

三、函数指针

1.存放函数地址的指针

void test()
{
  printf("hehe\n");
}
void (*ptest)()=test;//函数指针,存放test函数的地址
//ptest先和*结合,说明ptest是指针,指针指向的是一个函数,执行的函数无参数,返回值类型为void1

2.代码1 ((void ()( )0))();
解释:void (*)( )是一个函数指针,把0强制类型转换成函数指针,整个代码的意思是调用0地址出的函数。
代码2 void (signal(int,void()(int)))(int);
解释:1. signal是一个函数声明
2. signal函数的参数有2个,第一个是int,
第二个是函数指针,该函数指针能够指向的函数有一个int参数, 返回类型为void
3. signal函数的返回类型为函数指针,该函数指针能够指向的函数有一个int参数,
返回类型为void。
简化代码2

typedef  void(*pfun_t)(int);//pfun_t是类型名
pfun_t signal(int,pfun_t);1

四、函数指针数组

1.把函数的地址存到一个数组中,这个数组就叫函数指针数组。

int *arr[10];//指针数组
int (*parr1[10])();//函数指针数组
//parr1先和[ ]结合,说明parr1是数组,数组的内容是int (*)()类型的指针1

2.用途:转移表
例如:计算器

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 (*p  )(int, int) = Add;
    int (*p1[4])(int, int) = {Add, Su b, Mul, Div};//函数指针数组
    return 0;
}

五、指向函数指针数组的指针

1.是一个指针,指针指向一个数组,数组的元素都是函数指针。
2.定义 

int (*p  )(int, int) = Add;//函数指针
int (*p1[4])(int, int) = {Add, Su b, Mul, Div};//函数指针的数组p1
int (*(*p2)[4])(int, int) =&p;//指向函数指针数组p1的指针p2
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值