C 语言中的作为函数参数的指针

原文:https://www.studytonight.com/c/pointer-with-function-in-c.php

指针作为函数参数用于保存函数调用期间传递的参数地址。这也被称为通过引用调用。当通过引用调用函数时,对引用变量所做的任何更改都会影响原始变量。


示例时间:使用指针交换两个数字

#include <stdio.h>

void swap(int *a, int *b);

int main()
{
    int m = 10, n = 20;
    printf("m = %d\n", m);
    printf("n = %d\n\n", n);

    swap(&m, &n);    //passing address of m and n to the swap function
    printf("After Swapping:\n\n");
    printf("m = %d\n", m);
    printf("n = %d", n);
    return 0;
}

/*
    pointer 'a' and 'b' holds and 
    points to the address of 'm' and 'n'
*/
void swap(int *a, int *b) 
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

交换后 m = 10n = 20:m = 20n = 10


返回指针变量的函数

一个函数也可以return一个指向调用函数的指针。在这种情况下,你必须小心,因为函数的局部变量不在函数之外。它们只在函数内部有作用域。因此,如果您返回一个连接到局部变量的指针,当函数结束时,该指针将什么也不指向。

#include <stdio.h>

int* larger(int*, int*);

void main()
{
    int a = 15;
    int b = 92;
    int *p;
    p = larger(&a, &b);
    printf("%d is larger",*p);
}

int* larger(int *x, int *y)
{
    if(*x > *y)
        return x;
    else
        return y;
}

92 更大


返回有效指针的安全方法。

  1. 要么使用带有函数的参数。因为传递给函数的参数是在调用函数内部声明的,因此它们也将存在于函数外部。

  2. 或者,在函数内部使用static 局部变量并返回它们。由于静态变量在main()函数退出之前有一个生命周期,因此它们可以通过程序使用。


指向函数的指针

可以声明一个指向某个函数的指针,该指针可以用作另一个函数的参数。指向函数的指针声明如下,

type (*pointer-name)(parameter);

这里有一个例子:

int (*sum)();   //legal declaration of pointer to function
int *sum();     //This is not a declaration of pointer to function

当一个函数指针被分配了该函数的名称时,它可以指向一个特定的函数。

int sum(int, int);
int (*s)(int, int);
s = sum;

这里s是一个函数sum的指针。现在可以使用函数指针s调用sum,同时提供所需的参数值。

s (10, 20);

指向函数的指针示例

#include <stdio.h>

int sum(int x, int y)
{
    return x+y;
}

int main( )
{
    int (*fp)(int, int);
    fp = sum;
    int s = fp(10, 15);
    printf("Sum is %d", s);

    return 0;
}

Twenty-five


复杂函数指针示例

你会发现周围有很多复杂的函数 指针的例子,让我们看一个这样的例子,试着去理解它。

void *(*foo) (int*);

看似复杂,其实很简单。在这种情况下(*foo)是函数的指针,它的参数是int*类型,返回类型是void*