这个问题最初被标记为 C 和 C++,而不是“与语言无关”。 作为一个与语言无关的问题,它应该被关闭,因为它太宽泛了,但我希望 OP 将它恢复为原始版本,所以我不会投票关闭。作为一个 C/C++ 问题,虽然可以回答,但由于过于宽泛而被关闭,然后当范围被极大地扩大到无法回答时,通过将标记更改为与语言无关,它被重新打开为现在可以回答。
我正在回答 C++ 的原始问题,这里和那里散布了一些 C 知识。
我认为当前的“语言无关”问题是无法回答的,尽管尝试了一个与语言无关的答案。
1。指针的大小取决于什么?
普通数据指针所需的最小大小取决于所指向类型的对象或不同函数的最大可能内存位置数;需要区分 n 个可能的位置 ceil(lg2(n)) 位。
因此,最小指针大小取决于最大可能的内存大小。
因此最小指针大小也取决于指向类型的对齐方式。在一些现在过时的机器上,甚至可能在一些现存的机器(大型机?)上,内存的硬件级可寻址单元是word,例如2 或 4 个字节。然后可以使用小指针来寻址字对齐的数据,而 char* 和因此 void* 需要更大。
因此,第 3.9.2/4 节中的 C++11 标准要求“cv void* 类型的对象应具有相同的
表示和对齐要求为 cv char*。”
C++ 中的成员函数指针比指针更类似于偏移量,并且通常比正确的指针大。
2。架构的哪些特性会影响指针的大小? (详细)
主要是从 C++ 看到的可寻址内存范围。
但值得回顾的是,在 MS-DOS 编程中,near 和 far 指针之间存在差异。 near 指针是隐含的 64K 内存段的偏移量,而 far 指针是大小的两倍,结合了段选择器和偏移量。
在(仍然)现代 32 位 PC 编程中,C 和 C++ 指针通常类似于 near 指针,不支持 far 指针,这将是6 个字节。要使用此类指针,必须使用其他语言,例如汇编语言。
3。编译器会影响指针的大小吗?怎么样?
使用的编译器和编译选项原则上会影响指针大小,因为标准没有规定大小。例如。它原则上可以添加信息以帮助调试。或者如前所述,使用语言扩展可以有 near 和 far 指针。
由于成员指针不是直接地址(在底层),如何表示它们以及它们有多大在很大程度上取决于编译器。
这也取决于使用的选项。
4。有哪些不同类型的指针,它们之间有何不同? (例如:函数指针和指向基本数据类型的指针有区别吗?近指针与远指针等)
在 C++03 中,函数指针无法转换为数据指针,反之亦然。这个限制支持哈佛架构的机器,它支持可能不同大小的函数指针和数据指针(例如,前者为 far,后者为 near)。在 C++11 中,有条件地支持这种转换,在 §5.2.10/8 中,由 Defect Report 195 产生。
值得注意的是,Posix 标准需要支持转换(函数指针)→ (void*) 和返回,例如对于dlsym 函数。
以上内容实际上意味着对象指针和函数指针是不同的。例如。后者不支持地址算术。另外,成员指针不同于真指针,更类似于偏移量。
现代 C++ 不支持近与远指针。
5。语言是否对指针有任何影响。 C 与 C++
C 不支持成员指针,在这个问题中它们被视为指针。
除此之外,C++ 的主要目标是能够直接使用 C 库,并且 C 标准被“合并”(C++11 §17.5.1.5/1)到 C++ 标准中,这需要兼容指针表示。
C 支持受限指针,即限定符restrict,C++ 不支持。但是,这只影响编译器对指针可能值的了解。这意味着 C 编译器可能能够生成更好的优化代码。