解析C语言中数组与指针的关系

本文详细解析了指针数组、数组指针、函数指针数组等概念及其应用场景,包括二维数组传参方式、函数指针数组的具体使用示例及指向函数指针数组的指针的定义方法。

指针数组

数组指针

函数指针

函数指针数组

指向函数指针数组的指针

首先说一些题外知识:
数组名代表整个数组的时候只有两种情况:
sizeof(数组名),这里的数组名表示整个数组
&数组名,这里的数组名表示整个数组。取出的是整个数组的地址。
指针数组
概念:指针数组是数组,是一个存放指针的数组

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

先和[ ]结合再与*结合,所以首先他是一个数组,其次数组每个单元的类型是指针,所以称为指针数组。
数组指针
概念:数组指针是指针。

int (*p)[10];

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

int (*p)[10] = &arr;
p是数组指针,所以存放数组的地址是合适的。

二维数组传参

void test()
{
int arr[3][5] = {0};
print(arr);
}
void print(int arr[3][5])//ok
{ }
void print(int arr[][5])//ok
{ }
void print(int (*arr)[5])//ok
{ }
void print(int **arr)//不可以arr传过来的地址是数组的地址(数组第一行的地址)不能放在二级指针中,可以放在数组指针中。
{ }

int arr[5];//整型数组
int *parr1[10];//指针数组
int (parr2)[10];//数组指针,不可以将第一个arr的地址放在parr2中,因为一个类型为int [5],另一个类型为int [10].也不可以将parr1的地址放在parr2中,两个类型不用一个是int [10],另一个是int [10];
int (*parr3[10])[5];//存放数组指针的数组

函数指针数组:把函数的地址存放到一个数组中,那这个数组就叫做函数指针数组

int (*parr1[10]) ();

parr1 先和[ ]结合,说明parr1是数组,数组的内容是int (*) ( )类型的函数指针。
函数指针数组的用途:转移表
例如:(计算器)

#include<stdio.h>
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int mul(int a, int b)
{
    return a * b;
}
int div(int a, int b)
{
    return a / b;
}
int main()
{
    int x, y;
    int input = 1;
    int ret = 0;
    int(*p[5])(int x, int y) = { 0,add,sub,mul,div };
    while (input)
    {
        printf("******************************\n");
        printf("    1:add             2:sub   \n");
        printf("    3:mul             4:div   \n");
        printf("******************************\n");
        printf("请选择:");
        scanf("%d", &input);
        if (input <= 4 && input >= 1)
        {
            printf("请输入操作数:");
            scanf("%d %d", &x, &y);
            ret = (*p[input])(x, y);
            printf("%d\n", ret);
        }
        else
            printf("输入有误\n");
    }
    return 0;
}

指向函数指针数组的指针
概念:首先它是一个指针,指针指向一个数组,数组的元素都是函数指针;
定义:

void test(const char* str)
{
    printf("%s\n", str);
}
int main()
{
    void(*pfun)(const char*) = test;//函数指针
    void(*pfunArr[5])(const char*);//函数指针数组
    pfunArr[0] = test;
    void(*(*pfunArr[5]))(const char*) = &pfunArr;//指向函数指针数组的指针
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值