指针函数与函数指针

来源:互联网 发布:人工智能娃娃 编辑:程序博客网 时间:2024/06/18 12:42

指针函数与函数指针

1、指针函数

指针函数是指带指针的函数,本质是一个函数,返回值是一个指针。
如:int *f(x, y);

2、函数指针

函数指针是指向函数的指针变量,即本质是一个指针变量。

    int (*f)(int x);//声明一个函数指针;    f = func;//将func函数的首地址赋给指针

指向函数的指针包含了函数的地址,可以通过它来调用函数。需要注意函数指针的声明需要和它指向的函数声明保持一致。
把函数的地址赋值给函数指针有两种方式:
void (*ptr)();
ptr = &fun;
ptr = fun;
取地址运算符&不是必须的,因为函数标识符就标号了函数的地址,如果是函数调用,需要这样使用:
x = (*ptr)();
x = ptr();
一般程序员倾向于使用第一种,它明确指出了通过指针而不是函数名调用函数。
区别:一个是指针变量,一个是函数。

3、指针的指针

二级指针的定义:
char **p;
指针的指针需要用到指针的地址:

    char c = 'A';    char *p = &c;    char **cp = &p;

通过二级指针,不仅可以访问它指向的指针,还可以访问它指向的指针所指向的数据,利用二级指针可以允许被调用函数修改局部指针变量和处理指针数组。

    int main(void)    {        int value[] = {7, 6, 5, -4, 3, 2, 1, 0};        int *fp = value;        fun(&fp);        printf("%d\n", *fp);    }    void fun(int **fpp)    {        while(**fpp != 0){            if(**fpp < 0)                break;            else                (*fpp)++;        }    }

首先用一个数组的地址常量来初始化指针fp,然后把指针fp的地址作为实参传递给函数fun(),fun()通过表达式**fpp间接访问数组中的数据,为了遍历数组找到一个负值,fun()函数进行自增运算的对象是调用者指向数组的指针,而不是它自己的指向调用者指针的指针。

4、指向指针数组的指针

指针数组一般用来处理字符串用。

    char *Name[]={Bill, Sam, Jim, Paul, Charles, 0};    int main(void)    {        char **nm = Names;        while(*nm != 0)            printf("%s\n", *nm++);        return 0;    }

先用字符型指针数组Names的地址来初始化指针nm,每次printf的调用都首先传递指针nm指向的字符型指针,然后对nm进行自增运算,所以会依次输出指针数组Name中的字符串,直到遇到0退出。

0 0
原创粉丝点击