C语言中指向指针的指针实践与函数导出

需积分: 9 0 下载量 173 浏览量 更新于2024-08-26 收藏 12KB DOCX 举报
"指向指针的指针" 在C语言中,指针是编程中非常重要的一个概念,它可以用来存储变量的地址,使得我们能够间接地访问和修改这些变量。而指向指针的指针(也称为二级指针或多级指针)则是指针的一个高级应用,它是指向指针本身的指针。这种类型的指针允许我们对指针进行更复杂的操作,例如动态分配内存、传递函数指针等。 在提供的代码中,可以看到以下几个关键知识点: 1. **函数指针**:`add` 和 `add1` 是两个整数加法的函数,它们都接受两个整数参数并返回它们的和。在C语言中,函数名可以被当作指针来使用,因此 `add` 和 `add1` 可以直接用于调用,也可以赋值给一个函数指针变量。例如,`int(*p)(int a, int b)` 就是一个函数指针类型,它能存储指向返回整数并且接受两个整数参数的函数的地址。 2. **多级指针**:在 `printf("\n%x,%x",&add,&add1);` 这一行,`&add` 和 `&add1` 分别是 `add` 和 `add1` 函数的地址,也就是函数指针的地址。这里的 `&` 操作符用于获取变量的地址,所以 `&add` 和 `&add1` 是指向函数指针的指针。 3. **函数指针赋值**:`int(*p)(int a, int b) = add;` 这行代码将 `add` 函数的地址赋给了函数指针 `p`,这样通过 `p` 我们就可以调用 `add` 函数。同理,如果 `p` 被赋值为 `add1` 的地址,那么 `p` 就可以调用 `add1`。 4. **循环调用**:在 `while` 循环中,`p(i, 1)` 被用来调用函数,并打印结果。这里 `p` 指向了某个函数(在这个例子中是 `add` 或 `add1`),每次循环会递增 `i` 的值并调用该函数,从而实现每隔两秒打印一次结果。 5. **动态链接库(DLL)函数导出**:`_declspec(dllexport) void go()` 是一个函数,它的目的是导出到动态链接库(DLL)。`void(**p)(int a, int b)` 定义了一个二级指针,它指向接受两个整数参数并返回整数的函数。通过 `(int(*)(int a, int b))0x87f7c4` 和 `(int(*)(int a, int b))0x8d1096`,可以将特定地址的函数赋值给这个二级指针,这在动态链接库中常用来指定函数入口点。 6. **系统调用**:`Sleep(2000)` 用于使程序暂停2秒钟,`system("pause")` 会在程序结束前暂停,等待用户按键,这样可以观察程序的运行结果。 以上就是关于C语言中指向指针的指针及其在实际代码中的应用。理解这一概念对于深入学习C语言和系统级编程非常重要,因为它涉及到内存管理、函数指针的传递以及动态链接库的交互等方面。