НОУ ИНТУИТ | Лекция | Основы языка Си: структура Си-программы, базовые типы и конструирование новых типов, операции и выражения
< Лекция 12 || Лекция 8: 1234567
Аннотация: Лекция посвящена введению в язык Си. Объясняются общие принципы построения Си-программы: разбиение проекта на h- и c-файлы, т.е. разделение интерфейса и реализации, использование препроцессора. Приводятся базовые типы языка Си, конструкции массива и указателя, позволяющие строить новые типы, а также модификаторы типов. Рассматриваются всевозможные операции и выражения языка Си.
Ключевые слова: Си, Java, указатель, адрес, массив, программа, контроль, операционная система, API, application program, interface, компилятор, слово, оператор DEFINE, файл, прототип функции, имя функции, константы, переменная, представление, standard input, препроцессор, директива, символическое имя, понимание текста, функция, алгоритм, значение, аргумент, вещественное число, вычисленное значение, вызов функции, стандартный поток вывода, логический тип, класс, тело оператора, специальный тип данных, volatility, Intel 80286, операции, сложение, умножение, оператор присваивания, префиксные операции, сумма элементов массива, аргумент операции, эквивалентное выражение, type cast, неявное преобразование
Основы языка Си
intuit.ru/2010/edi»>В настоящее время язык Си и объектно-ориентированные языки его группы (прежде всего C++, а также Java и C#) являются основными в практическом программировании. Достоинство языка Си — это, прежде всего, его простота и лаконичность. Язык Си легко учится. Главные понятия языка Си, такие, как статические и локальные переменные, массивы, указатели, функции и т.д., максимально приближены к архитектуре реальных компьютеров. Так, указатель — это просто адрес памяти, массив — непрерывная область памяти, локальные переменные — это переменные, расположенные в аппаратном стеке, статические — в статической памяти. Программист, пишущий на Си, всегда достаточно точно представляет себе, как созданная им программа будет работать на любой конкретной архитектуре. Другими словами, язык Си предоставляет программисту полный контроль над компьютером.Первоначально язык Си задумывался как заменитель Ассемблера
для написания операционных систем.
Тем не менее, область применения языка Си не ограничилась разработкой операционных систем. Язык Си оказался очень удобен в программах обработки текстов и изображений, в научных и инженерных расчетах. Объектно-ориентированные языки на основе Си отлично подходят для программирования в оконных средах.
В данном разделе будут приведены лишь основные понятия языка
Си (и частично C++).
Это не заменяет чтения полного учебника по
Си или C++, например, книг [6] и [8].
Мы будем использовать компилятор C++ вместо Cи. Дело в том, что язык Си почти целиком входит в C++, т.е. нормальная программа, написанная на Си, является корректной C++ программой. Слово «нормальная» означает, что она не содержит неудачных конструкций, оставшихся от ранних версий Си и не используемых в настоящее время. Компилятор C++ предпочтительнее, чем компилятор Си, т.к. он имеет более строгий контроль ошибок. Кроме того, некоторые конструкции C++, не связанные с объектно-ориентированным программированием, очень удобны и фактически являются улучшением языка Си. Это, прежде всего, комментарии //, возможность описывать локальные переменные в любой точке программы, а не только в начале блока, и также задание констант без использования оператора #define препроцесора. Мы будем использовать эти возможности C++, оставаясь по существу в рамках языка Си.
Структура Си-программы
intuit.ru/2010/edi»>Любая достаточно большая программа на Си (программисты используют термин проект ) состоит из файлов. Файлы транслируются Си-компилятором независимо друг от друга и затем объединяются программой-построителем задач, в результате чего создается файл с программой, готовой к выполнению. Файлы, содержащие тексты Си-программы, называются исходными.
В языке Си исходные файлы бывают двух типов:
- заголовочные, или h-файлы;
- файлы реализации, или Cи-файлы.
Имена заголовочных файлов имеют расширение » .h «. Имена файлов реализации имеют расширения » .c » для языка Си и » .cpp «, » .cxx » или » .cc » для языка C++.
К сожалению, в отличие от языка Си, программисты не сумели договориться о едином расширении имен для файлов, содержащих программы на C++.
Мы будем использовать расширение » .h » для заголовочных файлов и расширение » .cpp » для файлов реализации.
Заголовочные файлы содержат только описания. Прежде всего, это прототипы функций. Прототип функции описывает имя функции, тип возвращаемого значения, число и типы ее аргументов. Сам текст функции в h-файле не содержится. Также в h-файлах описываются имена и типы внешних переменных, константы, новые типы, структуры и т.п. В общем, h-файлы содержат лишь
int x;
определяющая целочисленную переменную x, является ошибкой.
Вместо этого следует использовать описание
extern int x;
означающее, что переменная x определена где-то в файле реализации (в каком — неизвестно). Слово extern (внешняя) лишь сообщает информацию о внешней переменной, но не определяет эту переменную.
Файлы реализации, или Cи-файлы, содержат тексты функций и определения глобальных переменных. Говоря упрощенно, Си-файлы содержат сами программы, а h-файлы — лишь информацию о программах.
Представление исходных текстов в виде заголовочных файлов и файлов реализации необходимо для создания больших проектов, имеющих модульную структуру. Заголовочные файлы служат для передачи информации между модулями. Файлы реализации — это отдельные модули, которые разрабатываются и транслируются независимо друг от друга и объединяются при создании выполняемой программы.
intuit.ru/2010/edi»>Файлы реализации могут подключать описания, содержащиеся в заголовочных файлах. Сами заголовочные файлы также могут использовать другие заголовочные файлы. Заголовочный файл подключается с помощью директивы препроцессора #include. Например, описания стандартных функций ввода-вывода включаются с помощью строки
#include <stdio.h>
(stdio — от слов standard input/output). Имя h-файла записывается в угловых скобках, если этот h-файл является частью стандартной Си-библиотеки и расположен в одном из системных каталогов. Имена h-файлов, созданных самим программистом в рамках разрабатываемого проекта и расположенных в текущем каталоге, указываются в двойных кавычках, например,
#include "abcd.h"
Препроцессор — это программа предварительной обработки текста
непосредственно перед трансляцией. Команды препроцессора называются директивами. Директивы препроцессора содержат символ диез # в начале
строки.
#define PI 3.14159265
задает символическое имя PI для константы 3.14159265. После этого имя PI можно использовать вместо числового значения. Препроцессор находит все вхождения слова PI в текст и заменяет их на константу. Таким образом, препроцессор осуществляет подмену одного текста другим. Необходимость использования препроцессора всегда свидетельствует о недостаточной выразительности языка. Так, в любом Ассемблере средства препроцессирования используются довольно интенсивно. В Си по возможности следует избегать чрезмерного увлечения командами препроцессора — это затрудняет понимание текста программы и зачастую ведет к трудно исправляемым ошибкам. В C++ можно обойтись без использования директив #define для задания констант. Например, в C++ константу PI можно задать с помощью нормального описания
const double PI = 3.14159265;
Это является одним из аргументов в пользу применения компилятора C++ вместо Си даже при трансляции программ, не содержащих конструкции класса.
Дальше >>
< Лекция 12 || Лекция 8: 1234567
Вопрос 27 Массивы и указатели в языке Си
Массивы описывают регулярную структуру данных одного типа.
Одномерные массивы:
int temp [365];
char arr [10];
char *point[10];
Двумерные массивы:
intarray[4] [10];
char arr [3] [7];
Число в [ ] указывает количество элементов массива, поэтому:
temp [365] — массив из 365 элементов.
Доступ
к каждому элементу осуществляется по
его индексу j
(номеру), т.е. temp[0],
temp[l],…,temp[364]-
последний элемент.] Элементы массива
нумеруются начиная с 0.
Можно также
использовать многомерные массивы,
например:
int arr[k][l]-[n];
Однако
следует помнить, что для хранения
элементов таких шесивов требуется
значительный объем памяти. Рассмотрим,
как происходит размещение элементов
массива в памяти ЭВМ. Как правило,
элементы массива занимают последовательные
ячейки памяти. При этом элементы
размещаются таким образом, что самый
последний индекс возрастает быстрее.
Это в случае двумерного массива означает,
что он будет записываться построчно:
строка за строкой. Поскольку указатели
указывают адрес ячейки, то между
массивами и указателями существует
тесная связь. Вспомним, что имя массива
— это указатель на его первый элемент.
По существу массив можно рассматривать
как индексированный указатель. Доступ
к элементам массива осуществляется по
номеру индекса. При этом приращение
индекса на единицу вызывает перемещение
указателя на число байт, соответствующее
объекту данного типа: для целых чисел
на 2 байта, для действительных — на 4 байта
и т.
Пример 4.5:
int mas[10];
int *ptr;
ptr = mas; // присваивает адрес указателю
// следующие операции дадут один и тот же результат:
mas[2] = 20;
*(ptr + 2) = 20;
// следующая операция прибавит 2 к первому элементу:
*ptr + 2;
Указатели и многомерные массивы. Рассмотрим двумерный массив и действия с указателями, int mas[4][2];
Int*ptr;
ptr= mas;
Ptr сейчас указывает на первый столбец первой строки,
т.е.49
ptr = = mas = = &mas [0] [0];
ptr+1 = = &mas[0] [1];
ptr+2 = = &mas[]][0];
ptr+3
= = &mas [1] [1] и
т.
д.
Двумерный массив можно представить как массив массивов. В случае мы имеем четырех элементный массив, состоящий из элементов. Примечательно, что этот четырех элементный массив можно представить в виде одномерного mas[0],…, mas[3]. При этом имя массива по-прежнему является указателем на его первый элемент, т.е. mas[0]= =&mas[0] [0] . На что же будут указывать mas[i]? В этом случае mas [i] указывает на i-тую строку, т.е. на первый элемент i — й строки. Таким образом
mas [0] == &mas [0] [0]; mas[l] = &mas[l] [0];
mas[2] == &mas [2] [0];
mas[3] == &mas [3] [0];
Массивы и указатели —различия.
Имя массива — является указателем — константой. Описания:
char stringl [20]= «Язык Си» и
char *string_2 = «Язык Си»;
размещают
в памяти соответствующую строку символов.
Различие состоит в том. что указатель
string_l
является константой, а указатель string_2
— переменной. Это различие проявляется
в случае использования операции
единичной’ приращения ++, Эту операции!
можно применять только к переменным.
Поэтому string_2++
— допустимая конструкция, a
string__l+T
— запрещенная. Однако и в том и в другом
случае можно использовать операции
сложения с указателем, т.е.
string_l + i ;
string_2 + i; — допустимые конструкции.
При задании массива символов можно указывать размер явно, например:
char mas_l [10] = «Яблоко»;
Или определить массив по ;
Char mas_2 [ ] = «Груша».
Отличается заключается в том, что во 2 случае будет выделено ровно столько памяти, сколько необходимо.
Массивы и указатели символьных строк
Часто
бывает необходимо иметь массив символьных
строк.
При этом возможно задать два типа
описаний:
1) char stringl [10] [20]; //10 строк по 20 символов
2) char* string_2[10]; // массив из 10 указателей на строки символов. Какие здесь различия? Различие заключается в том, что в первом случае задается «прямоугольный» массив, в котором каждая строка имеет фиксированную длину, а во втором определяется «рваный» массив, где длина каждой строки занимает столько байт , сколько необходимо.
Например:
char string_l[3] [7] = {«Яблоко», «Слива» , «Груша»};
char *string_[3]= {«яблоко», «слива», «груша»};
Заполнение массивов будет следуюим:
string_l: string_2:
Яблоко\0 яблоко\0
Слива\0\0 слива\0
Груша\0\0 груша\0
Понимание указателей на языке программирования C | Панос Микелакис | Intuition
Понимание указателей в языке программирования C | Панос Микелакис | Интуиция | MediumКомпьютерная наука
Интуитивно понятное объяснение
Опубликовано в·
6 мин.
Читать·
30 июля 2022Матери всех языков. C — один из самых мощных, эффективных и широко используемых языков в современном мире, хотя он и один из старейших. Он используется в операционных системах, встроенных системах, компиляторах, видеоиграх и многих других приложениях. Его преподают практически в каждом…
Автор Panos Michelakis
889 Последователи
·РедакторПопробуем понять мир вместе. Я отдаю 20% того, что зарабатываю, на благотворительность.
Еще от Паноса Мичелакиса и интуиции
Панос Мичелакис
в
Интуиция, стоящая за преобразованием Лапласа
Лаплас преобразование (LT), возможно, король прикладной математики. У каждого инженера, физика и математика обязательно есть…
·7 min read·27 сентября 2021 г.Mathcube
in
Удивительно простой способ вычисления площади любого многоугольника на сетке
900 45 В мире математики время от времени мы спотыкаемся
· чтение за 3 минуты·1 маяРошан Джо Винсент
in
Разложение по сингулярным числам (SVD) — Рабочий пример 900 03
Недавно я начал изучать рекомендательные системы и, в частности, совместную фильтрацию, в которой входная матрица оценок пользователей…
6 минут чтения·29 июля 2021 г.
Панос Мичелакис
в
900 08Понимание лапласиана и гармонические функции
В математике существует множество важных операторов, которые должен знать каждый инженер и физик. Мы уже говорили о…
·Чтение через 7 мин.·12 января 2022 г.Просмотреть все от Panos Michelakis
Рекомендовано на Medium
Kyra Krishna
в
Заполнение структуры в C: обзор, примеры, визуальные эффекты
Структура на C представляет собой составной тип данных, который позволяет группировать несколько переменных вместе и хранить их в одном блоке памяти. Если…
·7 мин чтения·16 февраляФабрицио Ди Гуардо
в
Объяснение управления памятью C++
Различия между стеком и кучей и почему их по-прежнему важно понимать
·9 мин чтения·22 мартаСписки
Истории, которые помогут вам расти как разработчику программного обеспечения
19 историй·4 8 сохранений
Лидерство
30 историй·16 сохранений
Как проводить более содержательные встречи 1:1
11 историй·23 сохранения
Истории, которые помогут вам повысить свой уровень на работе
19 историй ·38 сохранений
Etiris Magazine
Разработка игр на Python: создание простых игр с помощью Pygame и Arcade
Узнайте, как использовать Python и популярные библиотеки для создания веселых и интерактивных игр уд Махди
в
Раскрытие возможностей лямбда-выражений в C++
Лямбда-выражения — это анонимные функции (функции без имени), которые можно определить и использовать в C++.
Они обеспечивают удобный способ… ·Чтение через 6 мин·11 февраляДжейкоб Беннетт
в
Используйте Git как старший инженер это.
·4 минуты чтения·15 ноября 2022 г.Хусейн Насер
Как стать хорошим бэкэнд-инженером (основы)
Я работаю бэкэнд-инженером более 1 года 8 лет, и я был свидетелем того, как технологии приходят и уходят но одно всегда остается постоянным; Первый…
·11 минут чтения·3 декабря 2022 г. 1Зачем изучать язык программирования C? : Учебное пособие по C на хинди #1
Что такое кодирование и язык программирования C? : Учебное пособие по C на хинди #2
Установка и настройка кода VS с помощью компилятора C: Учебное пособие по C на хинди #3
Базовая структура программы на языке C на хинди: Учебное пособие по C на хинди #4
Основной синтаксис программы на C: Учебное пособие по C на хинди #5
Переменные и типы данных на C: Учебное пособие по C на хинди #6
Операторы на C: Учебное пособие по C на хинди #7
Программирование на C.
Упражнение 1. Умножение Таблицы: Учебное пособие по C на хинди #8
Спецификаторы формата C и управляющие последовательности с примерами : Учебное пособие по C на хинди #9
Операторы управления If Else на языке C: Учебное пособие по C на языке хинди #10
Операторы Switch Case Control на языке C: C Учебник на хинди #11
Циклы в C: Учебник по C на хинди #12
Do While Цикл в C: Учебник по C на хинди #13
While Цикл в C: Учебник по C на хинди #14
Цикл For в C: Учебник по C на хинди #15
Операторы Break and continue в C: Учебное пособие по C на хинди #16
Оператор Goto в C: Учебное пособие по C на хинди #17
Приведение типов в C: Учебное пособие по C на хинди #18
Функции в C: Учебное пособие по C In Hindi #19
C Упражнение 1: Решение таблицы умножения + Shoutouts: C Tutorial In Hindi #20
Рекурсивные функции: рекурсия на языке C: Учебное пособие по C на хинди #21
Упражнение 2: Единицы и преобразования: Учебное пособие по C на хинди #22
Массивы на языке C: Учебное пособие по C на хинди #23
Упражнение 2: Решение + Shoutouts: Учебное пособие по C на хинди #24
Упражнение 3 по рекурсиям: Учебное пособие по C на хинди #25
Указатели на C: Учебное пособие по C на хинди #26
Массивы и арифметика указателей на языке C: Учебное пособие по C на хинди #27
Упражнение 3.
Рекурсии: решение + крики: учебник по C на хинди #28
Всегда ли рекурсия хороша? : Учебное пособие по C на хинди #29
Упражнение 4. Печать шаблонов звезд на языке C: Учебное пособие по C на хинди #30
Вызов по значению и вызов по ссылке на языке C: Учебное пособие по C на хинди #31
Передача массивов в качестве функций Аргументы: Учебное пособие по C на хинди #32
Звездный узор на языке C — Упражнение 4 Решение: Учебное пособие по C на хинди #33
Строки на языке C: Учебное пособие по C на хинди #34
Строковые функции на языке C и string.h Библиотека: Учебное пособие по C на языке C Хинди # 35
Обращение массива в C — Упражнение 5: Учебное пособие по C на хинди #36
Структуры на C: Учебное пособие по C на хинди #37
Typedef В C: Учебное пособие по C на хинди #38
Unions In C: Учебное пособие по C на хинди #39
C Language Reversal Array Упражнение 5: Решение: Учебное пособие по C на хинди #40
Язык C HTML Parser Упражнение 6: Учебное пособие по C на хинди #41
Статические переменные в C: Учебное пособие по C на хинди #42
C Учебное упражнение 6: Решения и крики: Учебник C на хинди #43
C Language Менеджер туристического агентства Упражнение 7: Учебник C на хинди #44
Структура памяти программ на C — Динамическое выделение памяти: Учебник C на хинди #45
C Language Менеджер туристического агентства Упражнение 7 Решение: Учебник C на хинди # 46
Динамическое выделение памяти Malloc Calloc Realloc и Free(): Учебное пособие по языку C на хинди #47
Язык C Упражнение менеджера сотрудников 8: Учебное пособие по C на хинди #48
Классы хранения в C Auto, Extern Static и Register Классы хранения: C Учебник на хинди # 49
Менеджер сотрудников на C — Упражнение 8 Решение: Учебное пособие по C на хинди № 50
Камень, бумага, ножницы для кодирования на C Упражнение 9: Учебное пособие по C на хинди № 51
Пустой указатель на языке C: Учебное пособие по C на хинди № 52
Нулевой указатель на языке C: Учебное пособие по C на хинди #53
Висячий указатель на языке C: Учебное пособие по C на хинди #54
Дикий указатель на языке C: Учебное пособие по C на хинди #55
Rock, Paper & Scissors In Язык Си — Упражнение 9 Решение: Учебник по Си на хинди #56
Умножение матриц на языке C.
Упражнение 10: Учебное пособие по C на хинди #57
Введение и работа с препроцессором C: Учебное пособие по C на хинди #58
#define и #include Директивы препроцессора: Учебное пособие по C на хинди #59
Предопределенные макросы и другие директивы препроцессора: Учебное пособие по C на хинди №60
Умножение матриц на языке C — Упражнение 10 Решение: Учебное пособие по C на хинди №61
Файловый ввод-вывод на языке C: Учебное пособие по C на хинди №62
Проверка палиндрома на языке C. Упражнение 11: Учебное пособие по C на хинди #63
Функции для файлового ввода/вывода на языке C: Учебное пособие по C на хинди #64
Числовая программа на языке C: Упражнение 11 Решение: Учебное пособие по C на хинди #65
Автоматический генератор чеков на языке C — Упражнение 12: Учебное пособие по C На хинди #66
Режимы файлов, fgets, fputs, fgetc, fputc и многое другое по работе с файлами C: Учебное пособие по C На хинди #67
Аргументы командной строки на C: Учебное пособие по C на хинди #68
Автоматический генератор счетов на C (Решение) — Упражнение 12: Учебное пособие по C на хинди № 69
Калькулятор командной строки на C — Упражнение 13: Учебник по C на хинди #70
[Решено] Калькулятор командной строки на C Пример.

14159265;