指针的深入理解

递归(函数的实现)

指针数组

定义: 指针数组是数组,是一个存放指针的数组。

//下面哪个你认为是指针数组?
int *arr1[10];  //这里[]的优先级高于*的,所以arr1
//先于[]结合,所以这是一个数组,数组里面存的是int *类型

char *arr1[4]; //也是一个指针数组,存的是char *类型数据

char **arr3[5]; //也是一个指针数组,存放的
// 是 char **(char型指针的地址)

数组指针

定义:存数组的地址的指针

//概念分析
//数组指针,是指针
//我们已经熟悉:
//整形指针:int *pint 能够指向整形数据的指针
//浮点型指针:float * pf;能够指向浮点型数据的指针

//那数组指针是什么呢?指针?数组?
//例如:

int *p[10];  //这是一个指针数组

int (*p)[10]; //这是一个数组指针,定义一个容量为10的数组的指针

   //数组指针语法规定名字写在中间
   //指针的类型是 type+*
   int(*p)[10] ,int[10]相当于type

eg:
  int a[10];
  int (*p)[10] = a;
  printf("%p\n",p);
  printf("%p\n",p+1);//输出结果比上一行大40;
  //指针+1是加上其所指类型的大小,这个指针是一个int[10]
  //的指针,这个类型占40个字节。

int (*p)[10];
//解释:p先和*结合,说明p是一个指针变量,然后指向的是一个大小为10个整形
//的数组。所以p是一个指针,指向一个数组,叫数组指针。

函数指针

  • 定义:函数指针就是存函数地址的指针。

下面pfun1和pfun2哪个有能力存放test函数的地址?

void test()
{
    printf("hehe\n");
}
void (*pfun1)();  //可以,函数的指针
void *pfun2();    //不行,函数的声明
void fun(int (*a)[5])
{
    ;
}
int main()
{
    int a[10][5];
    void(*p)(int(*)[5]) = fun; //(想?)
    fun(a); //数组传参降级为指向内部元素类型的指针,这个数组的
            //内部元素是一个数组,是一个int [5]的数组
}

函数指针数组

  • 定义:把函数的地址存放到一个数组中。
int (*parr1[10])();  //函数指针数组
//这是一个定义与使用函数指针数组的过程
#include <stdio.h>

void box(int * x)
{
    printf("%d\n",*(x+1));
}
void box1(int *x)
{
    printf("%d\n",*(x+1));
}
void box2(int * x)
{
    printf("%d\n",*(x+1));
}
int main()
{
    int a[] = {1,2,3,4,5,6};
    int b[] = {11,22,33,44,55,66};
    int c[] = {111,222,333,444,555,666};
    void (*arr[])(int * x) = {box,box1,box2};
    arr[0](a);//输出的是函数指针数组的第一个元素对应的函数
              //,参数是a数组结果为2
    return 0;
}

指向函数指针数组的指针

指向函数指针数组的指针是一个指针
指针指向一个数组,数组的元素都是函数指针

#include <stdio.h>

void box(int * x)
{
    printf("%d\n",*(x+1));
}
void box1(int *x)
{
    printf("%d\n",*(x+1));
}
int main()
{
    void (*arr[2])(int *) = {box,box1};  //函数指针数组,数组元素都是函数指针的数组
    void (*(*tt)[2])(int *) = &arr;       //存放的是函数指针数组的地址
    printf("%p\n",arr);
    printf("%p\n",tt);

    return 0;
}
void test(const char *str)
{
   printf("%s\n",str);
}
int main()
{
    void (*pfun)(const char *) = test;//函数指针pfun
    void (*pfunArr[5])(const char * str);//函数指针的数组pfunArr
    void (*(*ppfunArr)[10])(const char *) = &pfunArr;
    //指向函数指针数组pfunArr的指针ppfunArr
    pfunArr[0] = test;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值