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