Передача указателей в функции
Часть раздела Logic & Flow путешествия по C на Coddy — урок 26 из 63.
Теперь, когда вы понимаете ограничения передачи по значению, давайте изучим, как передача указателей в функции решает эту проблему. Вместо передачи копии значения переменной, вы можете передать функции адрес переменной в памяти.
Когда вы передаете указатель в функцию, функция получает доступ к адресу исходной переменной в памяти. Это означает, что функция может работать напрямую с исходными данными, а не просто с их копией.
void processValue(int *ptr) {
// ptr содержит адрес исходной переменной
// Теперь функция может получить доступ к этой области памяти
}
int main() {
int x = 10;
processValue(&x); // Передаем адрес x
return 0;
}Обратите внимание, как мы используем оператор взятия адреса & при вызове функции для передачи адреса переменной. Параметр функции объявлен как int *ptr, что указывает на ожидание получения указателя на целое число. Эта фундаментальная техника открывает широкие возможности для взаимодействия функций с данными вашей программы.
Задание
ЛегкоНапишите программу на языке C, которая демонстрирует передачу указателей в функции. Ваша программа должна:
- Создать функцию с именем
displayValue, которая принимает указатель на целое число в качестве параметра - Внутри функции
displayValueиспользовать оператор разыменования для доступа к значению по адресу памяти и вывести его в формате:Value at address: [value] - В функции
mainобъявить целочисленную переменную с именемnumberи инициализировать её значением 42 - Вывести исходное значение в формате:
Original value: [value] - Вызвать функцию
displayValueи передать адрес переменнойnumber, используя оператор взятия адреса - После вызова функции вывести подтверждающее сообщение:
Function call completed
Ваш вывод должен демонстрировать, что функция успешно получает и обращается к адресу памяти исходной переменной:
Original value: 42
Value at address: 42
Function call completedЭта задача знакомит с фундаментальной концепцией передачи указателей в функции, что позволяет функции обращаться к ячейке памяти исходной переменной, а не работать с копией её значения.
Шпаргалка
При передаче указателей в функции функция получает доступ к адресу памяти исходной переменной вместо копии её значения.
Используйте оператор взятия адреса &, чтобы передать адрес переменной в функцию:
void processValue(int *ptr) {
// ptr содержит адрес исходной переменной
// Теперь функция может получить доступ к этой области памяти
}
int main() {
int x = 10;
processValue(&x); // Передаем адрес x
return 0;
}Параметр функции объявлен как int *ptr, чтобы указать, что она ожидает получения указателя на целое число.
Попробуйте сами
#include <stdio.h>
// TODO: Напишите здесь вашу функцию displayValue
int main() {
// TODO: Напишите здесь ваш код
// 1. Объявите и инициализируйте переменную number
// 2. Выведите исходное значение
// 3. Вызовите функцию displayValue
// 4. Выведите сообщение о завершении
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции