编译类型中是否知道函数地址的大小?
答案 0 :(得分:7)
指针上的算术运算将指针视为给定类型的对象数组。因此,当您向int *
添加3时,您前进三int
s。
函数指针不能解释为任何数组。说明,也许,或许不是。有些机器有一个单独的地址空间用于指示。有些机器有可变长度指令。
另外,函数的大小在编译时是已知的,但仅在编译器完成其工作之后才知道。在汇编语言中编译函数的大小本身可能很棘手,这是唯一一种编程,希望能够形成这样的结构。
答案 1 :(得分:1)
您只能对相关指针执行算术运算。例如,如果有一个缓冲区,其中有多个指针指向该缓冲区的不同位置,则可以对这些指针执行算术运算。但是,如果您尝试对两个不相关的指针执行指针运算,例如指向不同缓冲区的两个指针,那么未定义的行为。
除了指向同一函数的另一个指针外,函数指针不能与任何东西相关。
答案 2 :(得分:-2)
C不允许或定义函数指针的算术运算。你应该看看here。 这是因为当您对函数指针执行加法和减法操作时,将无法定义代码所在的位置。只是认为您正在为不同的硬件架构编译相同的C代码。当您递增或递减函数指针时,它们可能指向完全不同的代码部分(或您所说的指令),这些部分在不同平台上会不一致。