C. Тема 1. Раздел 11
.pdffunction2(1, (double)2); function2(1, 2.0); function2(1, (float)2);
Почему преобразование к float сработало?
Потому что при вызове функций происходит неявное преобразование чисел
float → double
char → int
short int → int
Часть 3
Передача по значению
Формальному параметру присваивается значение фактического параметра
Передача по ссылке
В формальный параметр может быть помещён сам фактический параметр (ссылка на фактический параметр)
Для указания этого типа передачи используется ключевое слово
Передача по имени
В формальный параметр помещается выражение для расчёта внутри подпрограммы
Передача через стек
Разновидность передачи параметра по значению
Понятия формальных и фактических параметров отсутствуют
Все параметры лежат на стеке, причём их типы, количество и порядок не контролируются компилятором
Реализация в Си: только передача по значению
Передача по ссылке осуществляется за счёт использования указателей
some_function(int i)
{
i++;
printf( "function i: %d\n", i ); return 1;
} |
|
|
|
|
|
function i: 2 |
|
|
|
|
|
void main() |
|
main i: 1 |
|
{ |
|
|
|
|
int i = 1; |
|
|
|
|
|
|
|
some_function( i ); |
|
|
|
printf( "main i: %d\n", i ); |
||
} |
|
|
|
some_function(int* i)
{
(*i)++;
printf( "function i: %d\n", *i ); return 1;
} |
|
|
|
function i: 2 |
|
|
|
|
void main() |
main i: 2 |
|
{ |
|
|
|
int i = 1; |
|
|
|
|
|
some_function( &i ); |
|
|
printf( "main i: %d\n", i ); |
|
} |
|
|
some_function(int* i)
{
*i = 10;
printf( "function i: %d\n", *i ); return 1;
} |
|
|
|
|
function i: 10 |
||
void main() |
|||
main i: 10 |
|||
{ |
|
||
|
int i; |
|
|
|
|
||
|
some_function( &i ); |
||
|
printf( "main i: %d\n", i ); |
||
} |
|
|
struct user
{
char* name; int age;
};
void print_user(struct user* u)
{
printf( "User name: %s\n", u->name ); printf( "User age: %d\n", (*u).age );
}
void main()
{
struct user u;
u.name = "Vasya Pupkin"; u.age = 20;
print_user( &u );
}
#define ARRAY_SIZE 5
void print_array( int* arr, int arr_size )
{
int i;
for( i = 0; i < arr_size; i++ )
{
printf( "arr[%d]: %d\n", i, arr[i] );
}
}
void main()
{
int a[ARRAY_SIZE] = {1, 2, 3, 4, 5}; print_array( a, ARRAY_SIZE );
}
#define ARRAY_SIZE 5
void print_array( int arr[], int arr_size )
{
int i;
printf( "Function array size: %d\n", sizeof( arr ) / sizeof( int ) );
for( i = 0; i < arr_size; i++ )
{
printf( "arr[%d]: %d\n", i, arr[i] );
}
}
void main()
{
int a[ARRAY_SIZE] = {1, 2, 3, 4, 5}; printf( "Main array size: %d\n",
sizeof( a ) / sizeof( int ) ); print_array( a, ARRAY_SIZE );
}
int abs( int i )
{
return i > 0 ? i : -i;
}
void main()
{
int i = -10; printf(
"Absolute value of %d: %d\n", i, abs( i ) );
}