Параметры в C не обязательно размещаются в стеке (*), но их scope обязательно будет ограничен функциональным блоком tomato
, и они обязательно будут передаваться по значению .
Когда вы разыменовываете a
и b
в присваивании *foo = *a + *b
, вы интерпретируете адрес памяти, хранящийся в указателях a
и b
, как целые числа, суммируя их и записываярезультат в адресе памяти, сохраненном в указателе foo
(который, в вашем примере, оказывается в куче).
После назначения вы можете изменить a
и b
по желанию с помощьюприсвоение им различных адресов памяти (т. е. указателей), и это не будет иметь никакого значения для любых ссылок на внешнюю память, поскольку их область ограничена функциональным блоком (например, a = foo
).Однако, если вы изменили содержимое памяти, на которое они ссылаются (например, *a = 0
), это станет видимым вне области действия функции, как если бы вы выполняли запись в пространство памяти (стек или кучу), выделенное где-то еще.
(*) Параметры не могут быть переданы в память (т. Е. В стек) функциям.В зависимости от компилятора / архитектуры они могут быть непосредственно назначены регистру процессора.В любом случае, это прозрачная оптимизация компилятора, и вам не нужно об этом беспокоиться ... параметры будут вести себя одинаково.