Язык Си с нуля - Лекция 1.2 из курса CS50

Язык Си с нуля - Лекция 1.2 из курса CS50
На чтение
162 мин.
Просмотров
12
Дата обновления
10.03.2025

Язык Си с нуля — лекция 1.2 из курса CS50

Добро пожаловать в увлекательный мир программирования! Этот урок станет отправной точкой в мир разработки программного обеспечения. Мы рассмотрим основы одного из самых влиятельных и широко используемых языков программирования – Си.

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

В этом уроке мы заложим фундамент вашего понимания Си. Мы познакомимся с базовыми концепциями, такими как переменные, типы данных и операторы, которые являются строительными блоками любой программы.

Так что, приготовьтесь к путешествию в мир программирования Си! Мы начнем с азов и постепенно будем углубляться в более сложные концепции, пока вы не почувствуете уверенность в создании своих собственных программ.

Ноvice в Си

Сегодня нам предстоит погрузиться в самую суть основ программирования на Си. Мы познакомимся с фундаментальными понятиями и попробуем написать свою первую программу.

Для начинающих, Си может показаться сложным, но мы сделаем все возможное, чтобы упростить процесс обучения. Будем разбивать большие задачи на более мелкие, чтобы их стало легче освоить.

Мы начнем с изучения базовых типов данных, переменных и операторов. Затем разберемся с функциями, библиотеками и структурами управления потоком.

И не стоит забывать, что Си – мощный и гибкий язык, который используется для создания множества программ, от операционных систем до приложений для Интернета.

Переменные в программировании

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

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

Например, переменная с именем "age" может хранить целое число (возраст в годах), а переменная "username" может хранить строку (имя пользователя).

Чтобы использовать переменную, нам сначала нужно ее объявить. Это сообщает компилятору о существовании переменной и о том, какой тип данных она хранит.После объявления мы можем присвоить значение переменной с помощью оператора присваивания (=).

Объявление и присвоение переменных являются основополагающими понятиями в программировании. Они позволяют нам управлять данными и выполнять логические операции на этих данных, создавая основу для построения эффективных и функциональных программ.

Типы данных

Каждый фрагмент данных обрабатываемой программой должен иметь тип. Тип определяет, как именно будут храниться и обрабатываться данные.

Типы данных делятся на:

*

Базовые

Включают в себя:

- целые числа (int)

- числа с плавающей точкой (float, double)

- символы (char)

- логические переменные (bool)

*

Составные

Являются комбинацией базовых типов (например, массивы, структуры).

Каждый тип данных имеет свой размер и диапазон значений, которые он может хранить. Выбор правильного типа данных имеет решающее значение для эффективного использования памяти и точности вычислений.

Указатели

Это своеобразные "адреса" в памяти, которые содержат ссылки на другие участки памяти. Представьте их как дорожные знаки, которые указывают путь к другим местам в коде. Они невероятно мощные инструменты, позволяющие нам манипулировать данными на низком уровне.

Указатели объявляются со специальным символом "*" перед названием переменной. Они позволяют нам работать с данными по адресу, а не копировать их в новую переменную. Такая оптимизация обеспечивает эффективность и экономию памяти.

Важно помнить, что указатели не являются самими данными, а всего лишь указателями на них. Чтобы получить доступ к фактическим данным, нам нужно "разрешить" указатель с помощью оператора "*".

Использование указателей может быть сложным, но освоение их приемов открывает возможности для глубокого понимания и контроля над памятью и данными в приложении.

Операции с указателями

Это дает доступ к данным в различных местах памяти, облегчает управление памятью и позволяет выполнять операции оптимизации.

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

Оператор &: получение адреса

Чтобы получить адрес переменной, используется оператор &.

Например, пусть у нас есть int x = 5. Чтобы получить адрес x, мы напишем: int *ptr = &x;

Оператор *: разыменование

Чтобы получить значение по адресу, хранящемуся в указателе, используется оператор *.

Продолжая пример выше, если мы хотим получить значение x, хранящееся по адресу ptr, мы напишем: int value = *ptr;

Двумерные массивы

У нас есть данные, помещенные не в одну, а сразу в две линии или столбца. Они называются матрицами. В Си они именуются двумерными массивами. Саму же матрицу как тип данных часто наделяют отдельным именем.

Матрицы в СИ применяются не так часто, как одномерные массивы, но про них тоже стоит упомянуть. Они используются для записи матриц алгебраического типа, а также интервальных величин на плоскости.

Объявление двумерного массива

Объявление двумерного массива

Запись двумерного массива выглядит так:

тип_данных имя_массива[количество_строк][количество_столбцов];

Стоит отметить, что объявление двумерного массива совмещает в себе объявления нескольких одномерных массивов, что может впоследствии создать проблемы.

Строки

Строки – важнейшая составляющая программ. Они вобрали в себя текстовые данные и уникальные свойства, делая возможным открытие безграничных возможностей.

В обиход вошли как char*, а по сути являются массивами из элементов char, символов кириллицы или латиницы.

Символы, объединенные в одну последовательность, хранят в себе данные. Слова, числа, знаки препинания, – всё это отдельные символы, собранные воедино.

Работа со строками – важная задача. Она охватывает как простейшие, так и комплексные действия.

Строку в Си можно представить как массив символов, завершающийся нулевым символом \0.

Строковые литералы

Строковые литералы - это последовательности символов, заключенных в кавычки. Компилятор автоматически добавляет \0 в конец строки.

Строки в Си - это не просто последовательности символов, а полноценные массивы.

Объявление строк в Си

Объявить строку в Си можно с помощью типа данных char*. Пример: char str1[] = "Hello";

Переменной присваивается указатель на первый элемент массива, где будут храниться символы строки.

Операции со строками

В Си имеются встроенные функции для работы со строками, такие как strlen(), strcpy(), strcat() и другие.

Функции

Цель

Функции позволяют группировать код для конкретной задачи, улучшая читаемость и повторное использование кода. Они имеют имя, принимают аргументы и возвращают значения.

Типы функции

Функции делятся на:

* Встроенные: Имеющиеся в языке и готовые к использованию без объявления.

* Пользовательские: Определяемые программистом.

Структура

Пользовательские функции используют следующий синтаксис:

cpp

тип_возвращаемого_значения имя_функции(тип_аргумента имя_аргумента)

{

// Тело функции

return значение_типа_возвращаемого_значения;

}

Вызов функций

Вызов функции производится с помощью ее имени, аргументов и точки с запятой (;):

cpp

имя_функции(аргументы);

Параметры по умолчанию

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

cpp

void имя_функции(тип_аргумента имя_аргумента = значение_по_умолчанию)

Аргументы в функциях

Передача данных в функции происходит при помощи аргументов. Аргументы – это переменные, которые принимают значения при вызове функции. Это позволяет передавать информацию из вызывающей программы в саму функцию. Количество и типы аргументов обычно заранее определены в определении функции.

Использование аргументов

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

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

Возврат значений

Функция - это часть программы, которая может принимать параметры и возвращать результат. Результатом может быть как конкретное значение, так и отсутствие результата (void). Тип возвращаемого значения должен быть указан в объявлении функции.

int main()

В C функция main служит точкой входа в программу и должна возвращать целое число. Обычно возвращаемое значение равно 0, что указывает на успешное выполнение программы.

void vs. int

void vs. int

Если функция не возвращает никакого значения, то ее следует объявить как функцию void. Однако если функция производит какое-либо вычисление или выполняет действие, возвращающее результат, она должна быть объявлена как функция с возвращаемым типом.

Типы возвращаемых значений

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

Тип данных Пример возвращаемого значения
int 0
float 3.14
char 'a'

Возвращаемое значение функции можно использовать при присвоении значения переменной или для дальнейших операций в коде.

## Область действия

В рамках нашей дискуссии мы неоднократно сталкиваемся с понятием "область действия". Оно описывает зону, в которой доступен конкретный объект или элемент программы. Переменные и константы сохраняют свои значения и идентичность, пока находятся в пределах своей области действия. Как только они покидают ее, они становятся недоступными и теряют свои значения.

Разные области действия имеют различные правила. Область действия локальной переменной ограничена блоком или функцией, в которых она определена. Глобальные переменные доступны во всем исходном коде, в то время как область действия статических переменных охватывает весь файл.

Понимание области действия имеет решающее значение для отладки ошибок и предотвращения неопределенного поведения. Оно позволяет заранее предусмотреть проблемы, связанные с использованием неправильных переменных или повторным использованием имен переменных.

Статические локальные переменные

Отличительная особенность статических локальных переменных - сохранение их значения в течение всего времени существования программы. Даже если соответствующий блок кода больше не выполняется, переменная остается активной. Давайте рассмотрим этот тип данных подробнее!

Особенности статических локальных переменных

Объявление статических локальных переменных осуществляется с использованием ключевого слова "static". Область видимости таких переменных ограничена блоком, в котором они объявлены, однако их инициализация происходит один раз при первом вызове блока, а не при каждом его исполнении. Значение статической локальной переменной может изменяться в рамках блока и остается доступным после его завершения.

Преимущества использования статических локальных переменных

Статические локальные переменные могут быть полезны для сохранения информации, необходимой для последующих вызовов функции. Они могут применяться для подсчета вызовов функции, хранения промежуточных результатов или реализации элементарных форм памяти.

Примеры использования статических локальных переменных

Один из распространенных примеров использования статических локальных переменных - хранение количества вызовов определенной функции. Это позволяет отслеживать частоту использования функции и контролировать ее выполнение.

Еще одно применение статических локальных переменных - реализация функции, которая генерирует уникальные идентификаторы. При каждом вызове функции значение статической локальной переменной инкрементируется, генерируя уникальный номер.

Вопрос-ответ:

Что такое переменные и зачем они нужны?

Переменные - это именованные области памяти, в которых хранятся значения. Они позволяют нам хранить и изменять данные в программе. Например, переменная age может хранить возраст пользователя, а переменная score - его результат теста.

Какой тип данных использовать для хранения целого числа?

Для хранения целого числа в языке Си используется тип данных int (целое).

Видео:

1. CS50 на русском: Лекция #1 [Гарвард, Основы программирования, осень 2015 год]

0 Комментариев
Комментариев на модерации: 0
Оставьте комментарий