Путаница в отношении обработки разных указателей компилятором - PullRequest
0 голосов
/ 27 марта 2012

У меня есть пара путаниц в отношении указателей.

Я ставлю их все в форме вопроса.

1) Как компилятор обрабатывает различные указатели? 2) Как компилятор определяет тип данных указателей, переданных во время компиляции?

Все, что я знаю, указатели хранятся в памяти в виде целого числа без знака, которое используетсядержать базовый адрес объекта, на который он указывает.Теперь, это Таблица символов , которая играет ключевую роль?

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

Может быть, конкретный пример поможет. Попробуйте это:

#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 () *, является адресом struct Location? Ответ: программист сказал об этом, написав элемент управления * void go_north (struct Location) * const loc). *

Что касается вашего комментария к лексическому анализу, хотите верьте, хотите нет, компоновщику не нужно ничего знать о размере или расположении объекта, на который указывает объект, даже если указатели на такие объекты передаются между различными *. о объектов. Вот почему используются заголовочные файлы: так, чтобы компилятор предварительной ссылки знал макет во время предварительной компиляции. В особых условиях в таблицу символов может попадать много странных вещей, поэтому я не буду настолько смелым, чтобы категорически утверждать, что ни одна таблица символов никогда не будет содержать информацию, которую вы предлагаете; но при обычном использовании таблица символов пропускает информацию, потому что компоновщик не нуждается в ней.

Можно подозревать, что это не полностью отвечает на ваш вопрос, но пример может помочь сфокусировать вопрос, чтобы сделать его достаточно конкретным, чтобы на него можно было ответить. Так что, если конкретный пример помогает, плюс этот частичный ответ, вот они.

(Если вы оказались на платформе Linux, вам может показаться очень интересной команда readelf .)

0 голосов
/ 27 марта 2012

1) Как компилятор обрабатывает различные указатели?

Они обрабатываются как адреса памяти.Обычно 16- или 32- или 64-разрядное целое число без знака.

2) Как компилятор определяет тип данных указателей, переданных во время выполнения?

Компилятор C не определяет никаких данныхтипы во время выполнения.Типы указателей вычисляются во время компиляции.Во время выполнения указатели - это просто глупые адреса памяти, указывающие на неизвестные типы.

0 голосов
/ 27 марта 2012

В язык C не встроена функция для определения типа указателя во время выполнения. Вы всегда знаете тип во время компиляции.

void(char * x)
{
  // x points to a char
}
...