所以我想,在创建函数指针时,不需要operator &来获取初始函数的地址:

#include <stdio.h>

double foo (double x){
    return x*x;
}

int main () {

    double (*fun1)(double) = &foo;
    double (*fun2)(double) =  foo;

    printf("%f\n",fun1(10));
    printf("%f\n",fun2(10));

    printf("fun1 = %p \t &foo = %p\n",fun1, &foo);
    printf("fun2 = %p \t  foo = %p\n",fun2,  foo);       

    int a[10];

    printf("  a = %p \n &a = %p  \n",a,&a);

    return 0;
}

输出:

>./a.out 
100.000000
100.000000
fun1 = 0x4004f4      &foo = 0x4004f4
fun2 = 0x4004f4       foo = 0x4004f4
  a = 0x7fff26804470 
 &a = 0x7fff26804470 

然后我意识到对于数组也是如此,这意味着如果你有int a[10]个,a&a都指向相同的位置.为什么数组和函数会出现这种情况?保存在内存位置的地址是否与正在保存的值(地址)具有相同的地址?

推荐答案

给定int a[10]a&a都会产生相同的地址,是的,但它们的类型不同.

aint[10]型.当它隐式转换为指针类型时,指针的类型为int*,并指向数组的初始元素.&a的类型为int (*)[10](即指向10个整数数组的指针).因为数组中不能有填充,所以它们都会产生value相同的指针,但指针的types不同.

函数类似于数组,但并不完全相同.你的函数foodouble(double)型的.每当foo在表达式中使用且不是一元&运算符的操作数时,它就会隐式转换为指向自身的指针,其类型为double(*)(double).

因此,出于所有实际目的,函数名和指向同一函数的指针是可以互换的.有一些微妙之处,我在"Why do all these crazy function pointer definitions all work? What is really going on?"的回答中讨论过(这个问题是关于C++的,但是C++中非成员函数的规则与C中的函数相同.

C++相关问答推荐

C++ cout打印顺序与C print相比

有什么方法可以检测SunOS上的SparcWorks吗?

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

C指针地址和转换

为什么GCC C23中的关键字FALSE不是整数常量表达式?

正确的TCP/IP数据包 struct

Rust FFI--如何用给出返回引用的迭代器包装C风格的迭代器?

为什么cudaFree不需要数据 struct 的地址?

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

SSH会话出现意外状态

S和查尔有什么不同[1]?

如何使用libgpio(d)为Raspberry Pi编译C程序?

使用正则表达式获取字符串中标记的开始和结束

用C++高效解析HTTP请求的方法

赋值两侧的后置增量,字符指针

程序对大输入给出错误答案

`%%的sscanf无法按预期工作

C中2个数字的加法 - 简单的人类方法

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?

10 个字节对于这个 C 程序返回后跳行的能力有什么意义