关于编译器处理不同指针的困惑

时间:2012-03-27 16:26:09

标签: pointers compiler-construction compiler-theory

我对指针有一些困惑。

我将所有这些都置于问题的形式。

1)编译器如何处理各种指针?
2)编译器如何计算在编译时传递的指针的数据类型?

我所知道的,指针以无符号整数的形式存储在内存中,用于保存它所指向的对象的基址。
现在,符号表是否起到了关键作用?

3 个答案:

答案 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
}