数组指针与函数指针

这篇博客详细介绍了C语言中数组和指针的关系,包括一维数组、二维数组以及指针在函数参数传递中的用法。讲解了如何通过指针传递数组,以及一级指针和二级指针的使用。还举例说明了函数指针的概念,以及如何将函数作为参数传递。最后展示了两个有趣的代码片段,涉及函数指针的解构和声明方式。
摘要由CSDN通过智能技术生成

数组传参和指针传参
一维数组;
#include<stdio.h>
void test(int arr[])
{

}
void test(int arr[10])
{

}
void test(int* arr)//这里我们传指针也是没有任何问题的,因为arr传过来是指针类型它的类型是int*;
{

}
void test2(int* arr2[20])//arr2是一个指针数组,它的类型是int*类型;
{

}
void test2(int** arr2)//这里使用指针来接收也是对的arr2传过来就是一个指针,再放到我们的二级指针里;
{

}
int main()
{
    int arr[10] = { 0 };
    int* arr2[20] = { 0 };
    test(arr);
    test2(arr2);
    return 0;
}
二维数组;
void test(int arr[3][5])
{
//这里二维数组传参的时候只可以省略行,但列一定不可以省略;
}
void test(int(*arr)[5])
{
//这里使用指针传参像上面这种方法就是正确的,首先arr是一个指针,然后它对应的是第一行的数组,每个数组有5个元素,每个元素的类型是int
}
int main()
{
    int arr[3][5] = { 0 };
    test(arr);
    return 0;
}
//一级指针传参
void print(int* p, int sz)
{
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", *(p + i));
    }
}
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    int* p = &arr;
    print(p, sz);
    return 0;
}
//二级指针传参;
void test(int** pp)
{
    printf("%d ", **pp);
}
int main()
{
    int n = 10;
    int* p = &n;
    int** pp = &p;
    test(pp);
    return 0;
}
如果函数参数是一个二级指针,那么我们可以传什么样的参数呢?
举个例子:
void test(int** p)
{

}
int main()
{
    int* p;
    int** pp = &p;
    test(&p);//OK
    test(pp);//OK
    int* arr[10];
    test(arr);//OK//指针数组也可以
    return 0;
}
数组指针:指向数组的指针;
函数指针:指向函数的指针;
举个例子:
int Add(int x, int y)
{
    int z = 0;
    z = x + y;
    return z;
}
int main()
{
    int a = 10;
    int b = 20;
    /*printf("%d ", Add(a, b));*/
    //printf("%p\n", &Add);
    //printf("%p", Add);//两个地址一样说明函数名于&函数名都是函数的地址;
    int (*pa)(int, int) = Add;//那么再转换成指针就是这种方式;
    printf("%d", (*pa)(3, 5));
    return 0;
}
再举个例子:
void print(char* str)
{
    printf("%s\n", str);
}
int main()
{
    void (*p)(char*) = print;
    (*p)("hello,bit");
    return 0;
}
接下来看两段有意思的代码;
代码1:
(*(void (*)())0)();
解读:把0强制转换为void(*)()-函数指针类型-0就是一个函数的地址;调用0地址处的该函数;
代码2:
void(*single(int, void(*)(int)))(int);
解读:single是一个函数名字,然后它有两个参数,一个为int一个是函数指针,然后single本身也是一个函数指针,它的返回类型是void;
single是一个函数声明
single的函数参数有两个,第一个是int,第二个是函数指针,该函数指针指向的函数参数是int,返回类型是void
single函数的返回类型也是一个函数指针,该函数指针指向的函数参数是int,返回类型是void

简化:
//void(*single(int, void(*)(int)))(int);
//对于以上代码太过复杂不易于看懂,我们可以使用typedef重命名它,这里注意函数指针它与普通的重定义不同;
typedef unsigned int uint;//普通重定义;
typedef void(*pfun_t)(int);//函数指针类型,这里被重定义为pfunt_t,上面的函数就可以被命名为:
pfun_t single(int, pfun_t);    


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值