指针函数和函数指针

1.指针(型)函数

指针函数概念:

  本质上还是个函数,因其返回值是一个指针而得名。

  在C语言中允许一个函数的返回值是一 个指针(即地址),这种返回指针值的函数称为指针型函数

指针函数的定义和使用:

  • 格式:
    类型说明符 *函数名(形参表) {
      /*函数体*/
    }
    其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了 返回的指针值所指向的数据类型。
#include <stdio.h>
char *func(char str[]);
char *function(char *p);

int main(int argc, const char * argv[]) {
    /*
     返回指针的函数
     */
    char cs[] = "VSVSVSVSVS";
    char *str = func(cs);
    
    printf("%s\n",str);
    
    char *str2 = function(cs);
    printf("%s\n",str2);
    return 0;
}

// 定义一个返回指针的函数
char *func(char str[]) // 传数组
{
    str[0] = '!';
    return str;
}

char *function(char *p) // 传指针
{
    p[0] = '@';
    return p;
}

 

2.函数(型)指针(重点)

函数指针:

  本质上是一个指针,因该指针指向的是一个函数而得名。

为什么指针可以指向一个函数?

  函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址

函数指针的定义和使用:

格式:

函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
  • 其中“类型说明符”表示被指函数的返回值的类型。
  • “( 指针变量名)”表示“”后面的变量是定义的指针变量。
  • 最后的空括号表示指针变量所指的是一个函数。

// 无参数,无返回值的函数型指针

#include <stdio.h>
void func();

int main(int argc, const char * argv[]) {

    void (*funcP)(); // 定义指向函数的指针
    funcP = func; // 初始化 指向函数的 指针
func(); // 方法一:函数调用 (*funcP)(); // 方法二: 利用指针调用函数 funcP(); // 方法三: 利用指针调用函数 } void func() { printf("我被执行了!"); }

 

// 有参数,无返回值的函数型指针

#include <stdio.h>
void sum(int v1,int v2);

int main(int argc, const char * argv[]) {

    void (*sumP)(int,int); // 定义一个指向函数的指针
    sumP = sum; // 初始化函数指针
sumP(10,20); // 利用函数指针调用函数 (*sumP)(20,30); // 利用函数指针调用函数 // *sumP(20,30); // 错误写法,因为()的优先级高于* } void sum(int v1,int v2) { printf("sum = %d\n",v1 + v2); }

 

// 无参数,有返回值的函数型指针

#include <stdio.h>
int getAge();

int main(int argc, const char * argv[]) {

    int (*getAgeP)();
    getAgeP = getAge;

    int age1 = getAgeP();  // 利用函数指针调用函数
    int age2 = (*getAgeP)(); // 利用函数指针调用函数

    printf("%d,%d",age1,age2);

}

int getAge()
{
    return 26;
}

 

// 有参数,有返回值的函数型指针

#include <stdio.h>
int minus(int, int);

int main(int argc, const char * argv[]) {

    int (*minusP)(int,int); // 定义一个指向函数的指针
    minusP = minus; // 初始化函数指针

    int res = (*minusP)(20,1); // 利用函数指针调用函数
    int result = minusP(90,9); // 利用函数指针调用函数
    printf("res = %d,result = %d\n",res,result);
}

int minus(int val1, int val2)
{
    return val1 - val2;
}
  • 应用场景
    • 调用函数
    • 将函数作为参数在函数间传递

使用注意:

  • 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的
  • 函数调用中"(指针变量名)"的两边的括号不可少,其中的不应该理解为求值运算,在此处它 只是一种表示符号

 

posted @ 2015-10-20 16:26  oneSong  阅读(488)  评论(0编辑  收藏  举报