CPallini
В C
язык программирования, аргументы функций являются устаревшими по значению Следовательно, любая модификация, которую вызываемая функция вносит в свои аргументы, скрыта для вызывающего, например, попробуйте
#include <stdio.h>
void square_it( int n )
{
n = n * n;
printf("inside square_it, n = %d\n", n);
}
int main()
{
int i = 5;
printf("before function call, i = %d\n", i);
square_it( i );
printf("after function call, i = %d\n", i);
return 0;
}
Так что нет никакой возможности для этого.
square_it
чтобы сделать изменения видимыми для вызывающего абонента.
Указатели-это эффективный способ преодолеть такую трудность: указатели все еще передаются по значению (поэтому вызываемая функция не может изменяться
значение указателя), во всяком случае они обеспечивают
чтение-запись доступ к указанному значению. Попробуй:
#include <stdio.h>
void square_it2( int * p )
{
*p = *p * *p;
printf("inside square_it2, *p = %d\n", *p);
}
int main()
{
int i = 5;
printf("before function call, i = %d\n", i);
square_it2( &i ); // passing a poitner to i, that is i address
printf("after function call, i = %d\n", i);
return 0;
}
Теперь, пока
printf
не нуждается в изменении своих аргументов (это выходная функция)
scanf
делает (это входная функция). Следовательно, он нуждается в указателях переменных (адресах) в качестве аргументов.