📜  传递指向指针的指针和指向任何函数的指针地址之间的区别(1)

📅  最后修改于: 2023-12-03 15:22:06.177000             🧑  作者: Mango

传递指向指针的指针和指向任何函数的指针地址之间的区别

在C语言中,指针是一种非常重要的概念。它可以使我们能够间接地访问某变量的值。在很多情况下,传递指针是一种非常有效的方式来操作数据和执行函数。

有两种类型的指针:指向指针的指针和指向任何函数的指针地址。虽然这两种指针在语法上非常相似,但在用途上有很大的区别。

指向指针的指针

在C语言中,指向指针的指针是指一个指针,它指向另一个指针所指向的地址。具体来说,这意味着它有两个星号“**”,例如:

int num = 123;
int *p = #
int **pp = &p;

这里我们首先声明了一个整型变量 num,然后声明了一个指针 p,它指向 num 的地址。接着,我们声明了一个指针 pp,它指向指针 p 的地址。通过这种方式,我们可以可以间接地操作 num 的值而不是直接操作它。

下面是一个示例程序,展示了如何使用指向指针的指针来操作变量的值:

#include <stdio.h>

void changeValue(int **pp) {
    int num = 456;
    *pp = &num;
}

int main() {
    int num = 123;
    int *p = &num;
    int **pp = &p;

    printf("Before: *p=%d\n", *p);

    changeValue(pp);

    printf("After: *p=%d\n", *p);

    return 0;
}

在上面的示例程序中,我们首先定义了一个指向指针的指针 pp,它指向 p 的地址。在 changeValue() 函数中,我们定义了一个整型变量 num,并将其地址设置为 p 的值。最后我们修改 p 的值,使其指向 num 的地址。在 main() 函数中,我们调用 changeValue() 函数,并输出 p 的值,观察其是否已被更改。

指向任何函数的指针地址

指向任何函数的指针地址是指一个指针,它指向某个函数的地址。通常情况下,这种指针被用来实现回调函数。例如:

void (*p)(int) = &myFunction;

在上面的示例中,我们定义了一个函数指针 p,它指向函数 myFunction 的地址。然后我们可以将 p 作为参数传递给其他函数,这样这些函数就可以动态地调用 myFunction

下面是一个示例程序,展示了如何使用指向函数的指针地址:

#include <stdio.h>

void myFunction(int num) {
    printf("myFunction(): %d\n", num);
}

void callFunction(void (*p)(int)) {
    p(123);
}

int main() {
    void (*p)(int) = &myFunction;

    callFunction(p);
    
    return 0;
}

在上面的示例程序中,我们首先定义了一个函数指针 p,它指向 myFunction 函数的地址。然后我们定义了一个函数 callFunction(),它接受一个指向函数的指针作为参数。在 main() 函数中,我们调用了 callFunction() 函数,并将 p 作为参数传递。在 callFunction() 中,我们调用了 p,并输出了传入的参数。由于 p 指向的是 myFunction,因此最终输出的结果是 myFunction(): 123

总结

指向指针的指针和指向任何函数的指针地址都是指针的一种类型。它们在语法上非常相似,但在用途上有很大的区别。指向指针的指针通常用于间接地访问变量,传递指针或动态修改变量的值。而指向任何函数的指针地址通常用于实现回调函数或在运行时动态修改程序的行为。熟练掌握这两种指针的用法,可以使我们写出更加灵活和高效的代码。