Наиболее распространенная причина: потому что вы хотите изменить содержимое, не передавая его.
Аналогия:
Если вы хотите, чтобы ваша гостиная была окрашена, вы не хотите помещать свой дом на грузовиктрейлер, переместите его к художнику, позвольте ему сделать работу и затем возьмите его обратно.Это будет дорого и отнимает много времени.И если ваш дом слишком широк, чтобы его можно было тащить по улицам, грузовик может разбиться.Вы бы предпочли сообщить художнику, по какому адресу вы живете, попросить его пойти и сделать работу.
В терминах C, если у вас большой struct
или аналогичный, вам нужно, чтобы функция обращалась к этой структуре, не делая ее копию, передавая копию функции, а затем скопировав обратно измененныйсодержимое обратно в исходную переменную.
// BAD CODE, DONT DO THIS
typedef struct { ... } really_big;
really_big rb;
rb = do_stuff(rb);
...
rb do_stuff (really_big thing) // pass by value, return by value
{
thing->something = ...;
...
return thing;
}
Это делает копию rb
с именем thing
.Он помещается в стек, тратя много памяти и без необходимости увеличивая используемое пространство стека, увеличивая вероятность переполнения стека.А копирование содержимого из rb
в thing
занимает много времени выполнения.Затем, когда он возвращается, вы делаете еще одну копию, от thing
обратно до rb
.
Передав указатель на структуру, копирование не выполняется, но конечный результат оченьто же самое:
void do_stuff (really_big* thing)
{
thing->something = ...;
}