Изменение переменных через указатели
Часть раздела Logic & Flow путешествия по C на Coddy — урок 27 из 63.
Теперь вы можете использовать истинную мощь указателей: изменение исходной переменной через функцию. Когда вы передаете указатель в функцию, функция может использовать оператор разыменования для изменения значения, хранящегося по этому адресу памяти.
Внутри функции вы разыменовываете указатель, используя оператор *, чтобы получить доступ к значению исходной переменной и изменить его. Этот метод называется передача по ссылке, потому что вы передаете ссылку на расположение переменной в памяти.
void doubleValue(int *ptr) {
*ptr = *ptr * 2; // Разыменование для изменения исходного значения
}
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Эта задача демонстрирует возможности передачи по ссылке с использованием указателей, когда функция может навсегда изменить исходную переменную, разыменовывая указатель и изменяя значение в этой ячейке памяти.
Шпаргалка
Вы можете изменять исходную переменную через функцию, используя указатели. Эта техника называется передачей по ссылке, потому что вы передаете ссылку на расположение переменной в памяти.
Внутри функции разыменуйте указатель с помощью оператора *, чтобы получить доступ к значению исходной переменной и изменить его:
void doubleValue(int *ptr) {
*ptr = *ptr * 2; // Разыменование для изменения исходного значения
}
int main() {
int x = 5;
doubleValue(&x); // Передача адреса x
// x теперь равен 10!
return 0;
}Используйте *ptr в левой части присваивания, чтобы изменить значение по адресу памяти, который хранит указатель. Это позволяет функциям навсегда изменять переменные из вызывающей функции.
Попробуйте сами
#include <stdio.h>
// TODO: Напишите здесь вашу функцию tripleValue
int main() {
// TODO: Напишите здесь ваш код
// Объявите и инициализируйте переменную number
// Выведите исходное значение
// Вызовите функцию tripleValue
// Выведите конечное значение
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции