蓝布编程网

分享编程技术文章,编程语言教程与实战经验

C 语言函数名及对函数名取地址的区别和联系

在 C 语言中,函数可以像变量一样具有地址。函数的地址可通过在函数名前面加上 & 符号来获取。函数名作为函数的首地址,因此在使用函数指针时,可以直接使用函数名作为指针变量,但指向函数的地址和函数名的类型不一致,更直白点说,sizeof() 结果不一样的。

以下是C语言中函数名和取地址的区别和联系:

1. 函数名是函数的标识符,用于在程序中引用函数。它是函数的名称,可以用作函数调用或函数定义中的标识符。例如,int add(int a, int b) 中的 add 就是函数名。

2. 取地址操作符 & 用于获取变量或函数的地址。对于函数,使用 & 操作符可以获取函数的地址。例如, &add 将返回函数 add 的地址。

3. 函数名本身就是函数的地址。在大多数情况下,可以直接使用函数名作为函数指针变量。例如,int (*ptr)(int, int) = add 和 int (*ptr)(int, int) = &add 是等价的;

4. 函数指针可以用于在程序中动态地调用不同的函数。通过将函数指针作为参数传递给其他函数,可以实现回调函数和动态函数调用等功能。

5. 函数指针的类型必须与函数的声明匹配一致。函数指针的类型包括返回类型和参数类型。例如,函数 add 的声明是 int add(int a, int b) ,则相应的函数指针类型为 int (*)(int, int)。

总结起来,C 语言中函数名是函数的标识符,用于引用函数;取地址操作符 & 用于获取函数的地址;函数名本身就是函数的地址,可以直接使用函数名作为函数指针变量;函数指针可以用于动态调用不同的函数。

// function.c

// 编译及运行
// gcc function.c -o function && ./function

// 预期结果
// p:0x558119c5a169 q:0x558119c5a169
// sizeof(test):1 sizeof(&test):8

#include <stdio.h>

void test() {
    printf("test\n");
}

int main(int argc, char const *argv[])
{
    void (*p)() = test;
    void (*q)() = &test;
    printf("p:%p q:%p\n", p, q);
    printf("sizeof(test):%ld sizeof(&test):%ld\n", sizeof(test), sizeof(&test));
    
    return 0;
}
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言