Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Языки и методы программирования - лекция-8: ука...

Avatar for Anton Anton
December 08, 2024

Языки и методы программирования - лекция-8: указатели в Си

Лекция курса "Языки и методы программирования"
Лекция-8: указатели в Си
- Указатели в Си, передача параметров в функцию по значению vs по адресу
- Указатель — определение
- Передача параметра в функцию по значению vs по адресу
- Самостоятельно: решение квадратного уравнения в одной подпрограмме

Avatar for Anton

Anton

December 08, 2024
Tweet

More Decks by Anton

Other Decks in Education

Transcript

  1. Указатели (великие и ужасные) • Указатель — это переменная, которая

    хранит адрес другой переменной • Адрес — это число (целое беззнаковое) • Т. о. указатель хранит число, но не всякое число, а адрес
  2. Указатели (великие и ужасные) • В памяти: ячейка памяти достаточного

    размера, чтобы уместить адрес (для 32-битной архитектуры — 32 бит, для 64-битной — 64 бит и т. п.) • Компилятор: дополнительно «знает», адрес переменной какого типа хранит указатель. Это требуется, например, для операции разыменования указателя • Язык Си позволяет использовать указатель для того, чтобы читать и записывать значения в ячейку памяти, адрес которой хранит указатель • Одну и ту же переменную-указатель можно перенастраивать на разные целевые ячейки с разными адресами
  3. #include <stdio.h> int main() { int a = 25; int

    b = 32; printf("a=%d, b=%d\n", a, b); int* p1 = &b; *p1 = 7; printf("a=%d, b=%d\n", a, b); p1 = &a; *p1 = 9; printf("a=%d, b=%d\n", a, b); } a=25, b=32 вывод: a=9, b=7 a=25, b=7
  4. Здесь • int* p1 — объявление переменной-указателя p1 - «*»

    — говорит о том, что это указатель - «int» — говорит о том, что указатель указывает на переменную «int» • &a, &b — значение адреса (беззнаковое целое число) переменных a и b • *p — операция разыменования указателя: обращение к ячейке памяти, адрес которой хранит указатель, для чтения или записи. - размер ячейки и её содержимое трактуется как тип данных, для которого указатель объявлен (в нашем случае — int).
  5. scanf #include <stdio.h> int main() { int a = 0;

    printf("a=%d\n", a); printf("ENTER: a="); scanf("%d", &a); printf("ENTERED: a=%d\n", a); } a=0 ENTER: a=45 ENTERED: a=45 вывод:
  6. Решение квадратного уравнения • Хотим оформить в виде подпрограммы-функции •

    На входе: коэффициенты уравнения a, b, c • На выходе: число решений уравнения, корни уравнения (0, 1 или 2) • Как это оформить в виде функции? • (функция может возвращать только одно значение, а нам нужно 3)
  7. Решение квадратного уравнения • Можно сделать: - передать коэффициенты a,

    b, c по значению - передать переменные-корни x1, x2 по адресу - количество корней вернуть в качестве возвращаемого значения с return • Ввод и вывод значений с scanf и printf будет не в подпрограмме, а в главной функции main
  8. int solve_square_eq(double a, double b, double c, double* x1, double*

    x2) { int root_count = 0; // ... return root_count; } int main() { double a, b, c; double x1, x2; int root_count; // ... scanf: a, b, c ... root_count = solve_square_eq(a, b, c, &x1, &x2); // ... printf: root_count, x1, x2 ... }
  9. Задания • Воспроизвести код лекции • Оформить код решения квадратного

    уравнения в виде подпрограммы - на входе: коэффициенты уравнения - на выходе: количество корней, значения корней - НЕ использовать внутри: printf / scanf