1

编译类型中函数地址的大小不是已知的吗?

4

3 回答 3

7

指针上的算术运算将指针视为给定类型的对象数组。因此,当您将 3 添加到 an 时int *,您会前进 3 个ints。

函数指针不能被解释为任何东西的数组。说明,也许,也许不是。有些机器有单独的地址空间用于指令。有些机器有可变长度指令。

顺便说一句,函数的大小在编译时是已知的,但只有在编译器完成工作之后。在汇编语言中将函数的大小编译到自身中可能很棘手,汇编语言是唯一一种有希望形成这种结构的编程。

于 2013-01-24T14:45:34.423 回答
1

您只能对相关指针执行算术运算。例如,如果您有一个带有多个指向该缓冲区不同位置的指针的缓冲区,您可以对这些指针执行算术运算。但是,如果您尝试对两个不相关的指针执行指针运算,例如指向不同缓冲区的两个指针,那么这是未定义的行为

除了指向同一函数的另一个指针之外,函数指针不能与任何东西相关。

于 2013-01-24T14:45:42.707 回答
-2

C 不允许或定义对函数指针的算术运算。你应该看看这里。这是因为当您对函数指针进行加减运算时,它不会定义您将在代码中到达的位置。试想一下,您正在为不同的硬件架构编译相同的 C 代码。当您递增或递减函数指针时,它们可能指向完全不同的代码部分(或您所说的指令),这将在平台上不一致。

于 2013-01-24T14:47:00.123 回答