Может быть, конкретный пример поможет. Попробуйте это:
#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 .)