В целом (то есть в большинстве языков), вы можете передать по значению или пройти по ссылке. Это будет зависеть от определения функции и ее «подписи»; то есть способ, которым он и его аргументы объявлены.
Передача по значению - это как назначение, и, если копировать большую структуру, это займет больше времени. Кроме того, функция получает только копию, поэтому вы можете вносить изменения в аргумент в функцию, но это будет влиять только на локальную копию функции (аргумент) и не будет изменять NO исходное значение (в вызывающем), которое было передал вам.
В отличие от этого, передача по ссылке просто передает указатель (адрес в памяти) исходного значения.Это намного быстрее (4 или 8 байт), но это означает, что функция может не только читать, но и записать значение вызывающего абонента. Иногда ты этого хочешь! Иногда вы этого не делаете.
В целом, у вас есть значение статистики. Функция, которую вы вызываете, ожидает адрес (*), поэтому вместо передачи значения (статистики) вам необходимо передать его адрес (статистика).
В функции, вызывающей себя, у вас есть указатель на статистику (Статистика *), и вы должны передать указатель на статистику (Statistics *): следовательно, просто передайте ее, указатель 'statistic'.
Потому что он уже * есть * указатель. «Статистика» в основном является фактическим объектом. Вызов 'function1 (строка и статистика);' hand a * pointer * to function1. Поэтому, когда функция1 вызывает себя, она может просто использовать указатель, который она указала main(). – wildplasser
Объявите свою функцию как 'void function1 (char * string, Statistics * ptr)', и вы поймете, почему рекурсивный вызов 'function1 (string1, ptr);' – CiaPan