![]() |
1
4
指针通常只是基于x86架构的内存地址(我不知道其他架构)。编译器在编译时使用不同的指针来强制类型安全,因为将指向char的指针赋给指向int的指针毫无意义,尤其是因为指向的对象大小不同(因此,如果访问它们,您将获取随机内存)。您可以显式地重写它,并使用
因此,在机器级别,内存地址只是一个内存地址,CPU将尽职尽责地对其进行任何访问或调用。但是,这是危险的,因为您可能会混淆类型,并且可能不知道它。编译时检查有助于避免这种情况,但通常没有关于运行时存储在指针内部的实际类型的任何信息。 使用迭代器(STL提供的指针包装器)的一个优点是许多实现都有很多额外的检查 可以 在运行时启用:就像检查您是否使用了正确的容器一样,当您比较它们时,它们是相同类型的迭代器,等等。这是在指针上使用迭代器的一个主要原因——但是标准并不要求使用迭代器,所以请检查您的实现。 |
![]() |
2
10
编译器知道指针是什么类型,因为源代码指出指针是什么类型:
|
![]() |
3
4
AS James 也就是说,编译器“知道”指针是什么类型的,因为你告诉它。 不过,在封面下发生的事情(在一个非常简单的解释中)就不那么轻率了,解析器在阅读代码时,会用需要检查的信息注释其中的每一个重要部分,并强制执行它正在识别的语言规则。因此,给出这个示例代码:
编译器将在幕后执行类似的操作(同样是非常简单的形式):
事实同时比上面的要简单得多(因为计算机根本就不思考任何东西——它是非常机械的),而且要复杂得多(因为我已经详细讨论了机械过程中的大约十亿个细节)。 |
![]() |
4
1
这是将源代码转换为机器代码的语法分析的一部分。在最简单的示例中,您可以将其视为检查分配两侧的类型:
|
![]() |
5
1
指针只保存一个内存地址,而不保存其他内容。 意识到在汇编的级别(所有C/C++代码都被翻译成),在高级语言中不存在任何类型的概念。asm指令都在二进制值(字节、字、双字等)上运行,而不太关心程序是否认为给定的位集是int、char或其他什么。 (当然,除了我们对整数值和浮点值有不同的操作说明,但这并不是讨论的重点。) 因此,简短的答案是,类型完全是编译时构造,并存储在 symbol table 在编译器程序内部,将标识符映射到类型。在正在编译的程序中,类型不存在。 |
![]() |
6
0
视情况而定。继续阅读: Von Neumann architecture |
![]() |
7
0
在现代体系结构中,没有关于内存字是命令、数字、字符串的一部分还是指针的运行时信息。编译完成后,所有这些信息都将丢失(尽管在调试符号中可能仍然可用)。如果一个单词被编译后的代码用作指针,那么它必须是一个指针——CPU将不会为您检查。 用于在运行时维护此信息的较旧、更奇特的体系结构。请看这里: http://wapedia.mobi/en/Burroughs_large_systems?p=2 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 7 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 7 月前 |
![]() |
tTt · 使用堆栈中的值重新分配指针 8 月前 |
![]() |
manuel · 现代C中空指针的替代方案++ 9 月前 |