【CязыкфункцияПодробное объяснение параметров】——фактические параметры(Фактические параметры)&Формальные параметры(Катасан)
【CязыкфункцияПодробное объяснение параметров】——фактические параметры(Фактические параметры)&Формальные параметры(Катасан)
В этой статье мы узнаем о параметрах функций. Параметры функций делятся на фактические параметры и формальные параметры.

1. Что такое фактические параметры (фактические параметры)

Во-первых, давайте узнаем о фактических параметрах. Что такое фактические параметры?

Фактические параметры называются «фактическими параметрами».

При вызове параметризованной функции параметры в круглых скобках после имени функции называются «фактическими параметрами», то есть параметрами, которые мы фактически передаем функции. Фактическими параметрами могут быть: константы, переменные, выражения, функции и т. д. Независимо от того, к какому типу величин относятся фактические параметры, они должны иметь определенные значения при вызове функции, чтобы эти значения можно было передать формальным параметрам.

Давайте напишем код, который поможет вам понять:

Язык кода:javascript
копировать
#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;
}

Независимо от того, к какому типу величин относятся фактические параметры, они должны иметь определенные значения.

2. Что такое формальные параметры (формальные параметры)

Так что же такое формальные параметры?

Формальные параметры относятся к переменным в круглых скобках после имени функции. Поскольку формальные параметры создаются (выделяются единицы памяти) только при вызове функции, они называются формальными параметрами. Формальные параметры автоматически уничтожаются после завершения вызова функции. Поэтому формальные параметры действительны только внутри функций.

Также посмотрите код выше:

Язык кода:javascript
копировать
#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. Формальные параметры создаются (выделяется единица памяти) во время вызова функции.

До вызова функции формальные параметры еще не созданы.

Во время вызова функции создаются экземпляры формальных параметров.

Когда вызов функции завершается, жизненный цикл формального параметра завершается и уничтожается.

3. Связь между формальными и фактическими параметрами

Теперь, когда мы понимаем, что такое формальные параметры и фактические параметры функции, какова связь между ними?

Их отношения таковы:

После создания экземпляра формального параметра он фактически эквивалентен временной копии фактического параметра.

Здесь мы анализируем фактические параметры и формальные параметры функции:

Попробуем написать функцию для обмена содержимым двух целочисленных переменных.

Язык кода:javascript
копировать
#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 через эти два указателя и поменять их. .

Далее мы будем использовать метод вызова по адресу для реализации функции:

Язык кода:javascript
копировать
#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.

Короче говоря, наш окончательный вывод заключается в том, что связь между фактическими и формальными параметрами функции такова:

После создания экземпляра формального параметра он фактически эквивалентен временной копии фактического параметра.

Вышеизложенное представляет собой введение в параметры функции. Любые исправления приветствуются! ! !

boy illustration
[Спецификация] Результаты и исключения возврата интерфейса SpringBoot обрабатываются единообразно, поэтому инкапсуляция является элегантной.
boy illustration
Интерпретация каталога веб-проекта Flask
boy illustration
Что такое подробное объяснение файла WSDL_wsdl
boy illustration
Как запустить большую модель ИИ локально
boy illustration
Подведение итогов десяти самых популярных веб-фреймворков для Go
boy illustration
5 рекомендуемых проектов CMS с открытым исходным кодом на базе .Net Core
boy illustration
Java использует httpclient для отправки запросов HttpPost (отправка формы, загрузка файлов и передача данных Json)
boy illustration
Руководство по развертыванию Nginx в Linux (Centos)
boy illustration
Интервью с Alibaba по Java: можно ли использовать @Transactional и @Async вместе?
boy illustration
Облачный шлюз Spring реализует примеры балансировки нагрузки и проверки входа в систему.
boy illustration
Используйте Nginx для решения междоменных проблем
boy illustration
Произошла ошибка, когда сервер веб-сайта установил соединение с базой данных. WordPress предложил решение проблемы с установкой соединения с базой данных... [Легко понять]
boy illustration
Новый адрес java-библиотеки_16 топовых Java-проектов с открытым исходным кодом, достойных вашего внимания! Обязательно к просмотру новичкам
boy illustration
Лучшие практики Kubernetes для устранения несоответствий часовых поясов внутри контейнеров
boy illustration
Введение в проект удаления водяных знаков из коротких видео на GitHub Douyin_TikTok_Download_API
boy illustration
Весенние аннотации: подробное объяснение @Service!
boy illustration
Пожалуйста, не используйте foreach для пакетной вставки в MyBatis. Для 5000 фрагментов данных потребовалось 14 минут. .
boy illustration
Как создать проект Node.js с помощью npm?
boy illustration
Mybatis-plus использует typeHandler для преобразования объединенных строк String в списки списков.
boy illustration
Не удалось установить программное обеспечение Mitsubishi. Возможно, возникла проблема с реестром.
boy illustration
Разрешение ошибок проекта SpringBoot 3 mybatis-plus: org.apache.ibatis.binding.BindingException: неверный оператор привязки
boy illustration
Более краткая проверка параметров. Для проверки параметров используйте SpringBoot Validation.
boy illustration
Поиграйтесь с интеграцией Spring Boot (платформа запланированных задач Quartz)
boy illustration
Несколько популярных режимов интерфейса API: RESTful, GraphQL, gRPC, WebSocket, Webhook.
boy illustration
Redis: практика публикации (pub) и подписки (sub)
boy illustration
Подробное объяснение пакета Golang Context
boy illustration
Краткое руководство: создайте свое первое приложение .NET Aspire
boy illustration
Краткое обсуждение метода пакетной вставки MyBatis: обработка 100 000 фрагментов данных занимает всего 2 секунды.
boy illustration
[Инструмент] Используйте nvm для управления переключением версий nodejs, это так здорово!
boy illustration
HTML можно преобразовать в word_html для отображения текстовых документов.