Во-первых, давайте узнаем о фактических параметрах. Что такое фактические параметры?
Фактические параметры называются «фактическими параметрами».
При вызове параметризованной функции параметры в круглых скобках после имени функции называются «фактическими параметрами», то есть параметрами, которые мы фактически передаем функции. Фактическими параметрами могут быть: константы, переменные, выражения, функции и т. д. Независимо от того, к какому типу величин относятся фактические параметры, они должны иметь определенные значения при вызове функции, чтобы эти значения можно было передать формальным параметрам.
Давайте напишем код, который поможет вам понять:
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 20;
int b = 30;
int ret1 = add(20, 30);
printf("%d\n", ret1);
int ret2 = add(a, b);
printf("%d\n", ret2);
int ret3 = add(a + b, a - b);
printf("%d\n", ret3);
int ret4 = add(add(2, 3), 5);
printf("%d\n", ret4);
return 0;
}
Независимо от того, к какому типу величин относятся фактические параметры, они должны иметь определенные значения.
Так что же такое формальные параметры?
Формальные параметры относятся к переменным в круглых скобках после имени функции. Поскольку формальные параметры создаются (выделяются единицы памяти) только при вызове функции, они называются формальными параметрами. Формальные параметры автоматически уничтожаются после завершения вызова функции. Поэтому формальные параметры действительны только внутри функций.
Также посмотрите код выше:
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 20;
int b = 30;
//printf("%d %d", x, y);
int ret1 = add(20, 30);
printf("%d\n", ret1);
int ret2 = add(a, b);
printf("%d\n", ret2);
int ret3 = add(a + b, a - b);
printf("%d\n", ret3);
int ret4 = add(add(2, 3), 5);
printf("%d\n", ret4);
return 0;
}
1. Формальные параметры действительны только в функциях:
Если мы используем параметры функции вне функции, это невозможно.
2. Формальные параметры создаются (выделяется единица памяти) во время вызова функции.
До вызова функции формальные параметры еще не созданы.
Во время вызова функции создаются экземпляры формальных параметров.
Когда вызов функции завершается, жизненный цикл формального параметра завершается и уничтожается.
Теперь, когда мы понимаем, что такое формальные параметры и фактические параметры функции, какова связь между ними?
Их отношения таковы:
После создания экземпляра формального параметра он фактически эквивалентен временной копии фактического параметра.。
Здесь мы анализируем фактические параметры и формальные параметры функции:
Попробуем написать функцию для обмена содержимым двух целочисленных переменных.
#include <stdio.h>
//Реализован как функция, но не может выполнить задачу
void Swap1(int x, int y) {
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int num1 = 1;
int num2 = 2;
Swap1(num1, num2);
printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
return 0;
}
Функция swap1 получает числа num1 и num2 с x и y и меняет местами x и y, но печатаемые числа num1 и num2 не меняются местами. Почему?
Это связано с тем, что при вызове функции формальные параметры x и y являются временными копиями фактических параметров num1 и num2. Между формальными параметрами и фактическими параметрами нет реальной связи. Формальные параметры x и y являются двумя независимыми переменными. , а фактические параметры num1 и num2 занимают разные области памяти соответственно. Здесь формальные параметры и фактические параметры имеют одно и то же значение.
Следовательно, замена формальных параметров x и y не повлияет на фактические параметры num1 и num2! ! !
Здесь, если мы хотим достичь цели обмена реальными параметрами, нам нужно сделать вызов по адресу. Подробно мы объясним вам это позже. Теперь вы можете кратко рассмотреть это:
Так называемая передача адреса означает, что адреса num1 и num2 передаются в качестве параметров. Конечно, для их получения нам нужны два целочисленных указателя. Затем внутри функции мы можем найти num1 и num2 через эти два указателя и поменять их. .
Далее мы будем использовать метод вызова по адресу для реализации функции:
#include <stdio.h>
//Правильная версия
void Swap2(int* px, int* py) {
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int num1 = 1;
int num2 = 2;
Swap2(&num1, &num2);
printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
return 0;
}
На этот раз мы действительно достигли цели обмена числами num1 и num2.
Короче говоря, наш окончательный вывод заключается в том, что связь между фактическими и формальными параметрами функции такова:
После создания экземпляра формального параметра он фактически эквивалентен временной копии фактического параметра.
Вышеизложенное представляет собой введение в параметры функции. Любые исправления приветствуются! ! !