函数指针的一个例子以及*p和p[0]的关系

先说几个概念:
p[0]就是*p 就是p所指向的内存中的值

&p是p这个指针本身的地址,&p的类型是int**

&p[0]就是p[0]的地址,也就是p

(&p)[0],就是*(&p),也是p

*p,就是前面说的p[0]

p是一个指针变量的名字,表示此指针变量指向的内存地址,如果使用%p来输出的话,它将是一个16进制数。

*p表示此指针指向的内存地址中存放的内容,一般是一个和指针类型一致的变量或者常量。

&是取地址运算符,&p就是取指针p的地址

int fun1(void)
{
  printf("fun1\n" );
  return 1;
}

int fun2(void)
{
  printf("fun2\n" );
  return 1;
}

int fun3(void)
{
  printf("fun3\n" );
  return 1;
}

typedef int (* pf)(void);
int main(int argc, char const *argv[])
{
  int i;
  const pf array[] = {fun1,fun2,fun3};  //函数指针数组(只读)
  const pf *p;      //指向函数指针的指针(*p只读)
  //等价于p=array,array和&array[0]作为右值时,都是表示数组首元素的首地址。
  p = &array[0];    //把第一个元素的地址赋给p

  i = sizeof(array)/sizeof(array[0]);    //获取数组元素个数

  for (; i; i--,p++)
  {
    if (p[0])   //p[0]就是*p,就是指针p指向的内存中的值
    {
      printf("%d\n", (int)p[0]);
      (*p[0])();    //通过函数指针调用函数
    }
  }

  return 0;
}
下面分别举例说明函数指针指针函数的用法。 1. 函数指针例子: ```c #include <stdio.h> int add(int a, int b) { return a + b; } int minus(int a, int b) { return a - b; } int main() { int (*p)(int, int); // 声明一个函数指针 int a = 10, b = 5; p = add; // 指向 add 函数 printf("%d + %d = %d\n", a, b, p(a, b)); p = minus; // 指向 minus 函数 printf("%d - %d = %d\n", a, b, p(a, b)); return 0; } ``` 在这个例子中,我们定义了两个函数 add 和 minus,它们都接受两个 int 类型的参数,返回一个 int 类型的值。然后我们声明了一个函数指针 p,它可以指向任何接受两个 int 类型的参数,返回一个 int 类型的函数。在 main 函数中,我们将 p 分别指向 add 和 minus 函数,并使用 p 调用对应的函数,输出结果。 2. 指针函数例子: ```c #include <stdio.h> #include <stdlib.h> int* generate_array(int size) { int* arr = (int*)malloc(size * sizeof(int)); // 动态分配内存 for (int i = 0; i < size; i++) { arr[i] = i + 1; } return arr; // 返回指针类型 } int main() { int size = 5; int* arr = generate_array(size); // 调用指针函数生成数组 for (int i = 0; i < size; i++) { printf("%d ", arr[i]); // 输出数组 } free(arr); // 释放内存 return 0; } ``` 在这个例子中,我们定义了一个指针函数 generate_array,它接受一个 int 类型的参数 size,返回一个 int 类型的指针。在 generate_array 函数中,我们通过 malloc 函数动态分配内存,生成一个长度为 size 的 int 数组,并将每个元素初始化为数组下标 + 1。最后,我们返回数组的指针。在 main 函数中,我们调用 generate_array 函数生成一个长度为 5 的数组,并输出数组的每个元素。最后,我们使用 free 函数释放数组的内存。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值