我对指针有一些困惑。
我将所有这些都置于问题的形式。
1)编译器如何处理各种指针?
2)编译器如何计算在编译时传递的指针的数据类型?
我所知道的,指针以无符号整数的形式存储在内存中,用于保存它所指向的对象的基址。
现在,符号表是否起到了关键作用?
答案 0 :(得分:2)
也许一个具体的例子会有所帮助。试试这个:
#include <stdio.h>
const double step_size = 5.0; // degrees of arc
struct Location {
double latitude;
double longitude;
};
void go_north(struct Location *const loc) {
loc->latitude += step_size;
}
int main() {
struct Location there;
there.latitude = 41.0;
there.longitude = -101.5;
go_north(&there);
printf("Lat. %6.1f, long. %6.1f.\n", there.latitude, there.longitude);
return 0;
}
编译器如何知道地址* go_north()*接收是的结构位置的答案地址:程序员已经这么说了,通过写功能控制*无效go_north(结构位置* const loc)。*
关于对词法分析您的评论,无论你相信与否,链接器并不需要了解物体的大小或布局的事情指出,即使指针这样的对象不同的 *之间传来传去。 o 对象。这就是使用头文件的原因:以便预链接编译器在预链接编译时知道布局。在特殊情况下,很多奇怪的东西都可以放在符号表中,所以我不会那么大胆地断言,没有符号表包含你建议的信息;但在正常使用中,符号表省略了信息,因为链接器不需要它。
有人怀疑这并不能完全回答你的问题,但这个例子可能有助于集中这个问题,使其足够具体,可以回答。所以,如果一个具体的例子有帮助,加上这个部分答案,就在这里。
(如果您碰巧在Linux平台上,您可能会发现 readelf 命令非常有趣。)
答案 1 :(得分:0)
1)编译器如何处理各种指针?
它们作为内存地址处理。通常为16或32或64位无符号整数。
2)编译器如何计算出在运行时传递的指针的数据类型?
C编译器在运行时没有找出任何数据类型。指针类型在编译时计算出来。在运行时,指针只是指向未知类型的愚蠢内存地址。
答案 2 :(得分:-1)
C语言中没有内置功能来确定运行时指针的类型。你总是在编译时知道类型。
void(char * x)
{
// x points to a char
}