Tooprogram.ru

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Язык си типы данных

Типы данных в языке Си

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

Процесс проверки и накладывания ограничений на типы используемых данных называется контролем типов или типизацией программных данных . Различают следующие виды типизации:

  • Статическая типизация — контроль типов осуществляется при компиляции.
  • Динамическая типизация — контроль типов осуществляется во время выполнения.

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

Различают простые, составные и прочие типы данных.

Простые данные

Простые данные можно разделить на

  • целочисленные,
  • вещественные,
  • символьные
  • логические.

Составные (сложные) данные

  • Массив — индексированный набор элементов одного типа.
  • Строковый тип — массив, хранящий строку символов.
  • Структура — набор различных элементов (полей записи), хранимый как единое целое и предусматривающий доступ к отдельным полям структуры.

Другие типы данных

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

Программа, написанная на языке Си, оперирует с данными различных типов. Все данные имеют имя и тип. Обращение к данным в программе осуществляется по их именам (идентификаторам).

Идентификатор — это последовательность, содержащая не более 32 символов, среди которых могут быть любые буквы латинского алфавита a — z, A — Z, цифры 0 — 9 и знак подчеркивания (_). Первый символ идентификатора не должен быть цифрой.

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

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

ВерноНеверно
int a = 2, b;
b = a+3;
Int a=2; // правильно int
INT a=2;int a = 2, b;
b = A + 3; // идентификатор А не объявленint a = 2;
b = a + 3; // идентификатор b не объявлен

Целочисленные данные

Целочисленные данные могут быть представлены в знаковой и беззнаковой форме.

Беззнаковые целые числа представляются в виде последовательности битов в диапазоне от 0 до 2 n -1, где n-количество занимаемых битов.

Знаковые целые числа представляются в диапазоне -2 n-1 …+2 n-1 -1. При этом старший бит данного отводится под знак числа (0 соответствует положительному числу, 1 – отрицательному).

Основные типы и размеры целочисленных данных:

Количество битБеззнаковый типЗнаковый тип
8unsigned char
0…255
char
-128…127
16unsigned short
0…65535
short
-32768…32767
32unsigned intint
64unsigned long intlong int

Вещественные данные

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

Нормированная форма числа предполагает наличие одной значащей цифры (не 0) до разделения целой и дробной части. Такое представление умножается на основание системы счисления в соответствующей степени. Например, число 12345,678 в нормированной форме можно представить как

12345,678 = 1,2345678·10 4

Число 0,009876 в нормированной форме можно представить как

0,009876 = 9,876·10 -3

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

Значащие разряды числа, стоящие в нормированной форме после разделителя целой и дробной части, называются мантиссой числа .

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

  • знак — бит, определяющий знак вещественного числа (0 для положительных чисел, 1 — для отрицательных).
  • степень — определяет степень 2, на которую требуется умножить число в нормированной форме. Поскольку степень 2 для числа в нормированной форме может быть как положительной, так и отрицательной, нулевой степени 2 в представлении вещественного числа соответствует величина сдвига, которая определяется как

2 n -1,

где n — количество разрядов, отводимых для представления степени числа.

  • целое — бит, который для нормированных чисел всегда равен 1, поэтому в некоторых представлениях типов этот бит опущен и принимается равным 1.
  • мантисса — значащие разряды представления числа, стоящие после разделителя целой и дробной части в нормированной форме.
  • Различают три основных типа представления вещественных чисел в языке Си:

    ТипОбозна-
    чение в Си
    Кол-во битБиты степениМантиссаСдвиг
    простоеfloat3230…2322…0127
    двойной точностиdouble6462…5251…01023
    двойной расширен- ной точностиlong double8078…6462…016383

    Как видно из таблицы, бит целое у типов float и double отсутствует. При этом диапазон представления вещественного числа состоит из двух диапазонов, расположенных симметрично относительно нуля. Например, диапазон представления чисел типа float можно представить в виде:

    Пример : представить число -178,125 в 32-разрядной сетке (тип float ).

    Для представления числа в двоичной системе счисления преобразуем отдельно целую и дробную части:

    178,12510 = 10110010,0012=1,0110010001·2 111

    Для преобразования в нормированную форму осуществляется сдвиг на 7 разрядов влево).

    Для определения степени числа применяем сдвиг:

    0111111+00000111 = 10000110.

    Таким образом, число -178,125 представится в разрядной сетке как

    Символьный тип

    Символьный тип хранит код символа и используется для отображения символов в различных кодировках. Символьные данные задаются в кодах и по сути представляют собой целочисленные значения. Для хранения кодов символов в языке Си используется тип char .
    Подробнее о кодировке символов

    Логический тип

    Логический тип применяется в логических операциях, используется при алгоритмических проверках условий и в циклах и имеет два значения:

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

    Встроенные типы данных

    Общая информация

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

    В таблице 6.1 перечислены простейшие типы данных, которые определяет язык Си ++, и приведены наиболее типичные диапазоны их значений.

    Таблица 6.1. Встроенные типы языка Си++.

    НазваниеОбозначениеДиапазон значений
    Байтcharот -128 до +127
    без знакаunsigned charот 0 до 255
    Короткое целое числоshortот -32768 до +32767
    Короткое целое число без знакаunsigned shortот 0 до 65535
    Целое числоintот – 2147483648 до + 2147483647
    Целое число без знакаunsigned int (или просто unsigned )от 0 до 4294967295
    Длинное целое числоlongот – 2147483648 до + 2147483647
    Длинное целое число без знакаunsigned longот 0 до 4294967295
    Вещественное число одинарной точностиfloatот ±3.4e-38 до ±3.4e+38 (7 значащих цифр)
    Вещественное число двойной точностиdoubleот ±1.7e-308 до ±1.7e+308 (15 значащих цифр)
    Вещественное число увеличенной точностиlong doubleот ±1.2e-4932 до ±1.2e+4932
    Логическое значениеboolзначения true(истина) или false (ложь)

    Целые числа

    Для представления целых чисел в языке Си ++ существует несколько типов – char , short , int и long (полное название типов: short int , long int , unsigned long int и т.д. Поскольку описатель int можно опустить, мы используем сокращенные названия). Они отличаются друг от друга диапазоном возможных значений. Каждый из этих типов может быть знаковым или беззнаковым. По умолчанию тип целых величин – знаковый. Если перед определением типа стоит ключевое слово unsigned , то тип целого числа — беззнаковый. Для того чтобы определить переменную x типа короткого целого числа, нужно записать:

    Число без знака принимает только положительные значения и значение ноль. Число со знаком принимает положительные значения, отрицательные значения и значение ноль.

    Целое число может быть непосредственно записано в программе в виде константы . Запись чисел соответствует общепринятой нотации. Примеры целых констант: 0 , 125 , -37 . По умолчанию целые константы принадлежат к типу int . Если необходимо указать, что целое число — это константа типа long, можно добавить символ L или l после числа. Если константа беззнаковая, т.е. относится к типу unsigned long или unsigned int, после числа записывается символ U или u . Например: 34U , 700034L , 7654ul .

    Кроме стандартной десятичной записи, числа можно записывать в восьмеричной или шестнадцатеричной системе счисления. Признаком восьмеричной системы счисления является цифра 0 в начале числа. Признаком шестнадцатеричной — 0x или 0X перед числом. Для шестнадцатеричных цифр используются латинские буквы от A до F (неважно, большие или маленькие).

    Таким образом, фрагмент программы

    определяет три целые константы x , y и z с одинаковыми значениями.

    Отрицательные числа предваряются знаком минус «-«. Приведем еще несколько примеров:

    Для целых чисел определены стандартные арифметические операции сложения ( + ), вычитания ( — ), умножения ( * ), деления ( / ); нахождение остатка от деления ( % ), изменение знака ( — ). Результатом этих операций также является целое число . При делении остаток отбрасывается. Примеры выражений с целыми величинами:

    Кроме стандартных арифметических операций, для целых чисел определен набор битовых (или поразрядных) операций. В них целое число рассматривается как строка битов (нулей и единиц при записи числа в двоичной системе счисления или разрядов машинного представления).

    К этим операциям относятся поразрядные операции И , ИЛИ , ИСКЛЮЧАЮЩЕЕ ИЛИ , поразрядное отрицание и сдвиги. Поразрядная операция ИЛИ , обозначаемая знаком | , выполняет операцию ИЛИ над каждым индивидуальным битом двух своих операндов. Например, 1 | 2 в результате дают 3 , поскольку в двоичном виде 1 это 01 , 2 – это 10 , соответственно, операция ИЛИ дает 11 или 3 в десятичной системе (нули слева мы опустили).

    Аналогично выполняются поразрядные операции И , ИСКЛЮЧАЮЩЕЕ ИЛИ и отрицание .

    Операция сдвига перемещает двоичное представление левого операнда на количество битов, соответствующее значению правого операнда. Например, двоичное представление короткого целого числа 3 – 0000000000000011 . Результатом операции 3 (сдвиг влево) будет двоичное число 0000000000001100 или, в десятичной записи, 12 . Аналогично, сдвинув число 9 (в двоичном виде 0000000000001001 ) на 2 разряда вправо (записывается 9 >> 2 ) получим 0000000000000010 , т.е. 2 .

    При сдвиге влево число дополняется нулями справа. При сдвиге вправо бит , которым дополняется число, зависит от того, знаковое оно или беззнаковое. Для беззнаковых чисел при сдвиге вправо они всегда дополняются нулевым битом. Если же число знаковое, то значение самого левого бита числа используется для дополнения. Это объясняется тем, что самый левый бит как раз и является знаком — 0 означает плюс и 1 означает минус. Таким образом, если

    то результатом x >> 2 будет 0xFFC0 (двоичное представление 1111111111000000 ), а результатом y >> 2 будет 0x3FC0 (двоичное представление 0011111111000000 ).

    Рассмотренные арифметические и поразрядные операции выполняются над целыми числами и в результате дают целое число . В отличие от них операции сравнения выполняются над целыми числами, но в результате дают логическое значение истина ( true ) или ложь ( false ).

    Для целых чисел определены операции сравнения: равенства ( == ), неравенства ( != ), больше ( > ), меньше ( ), больше или равно ( >= ) и меньше или равно ( ).

    Последний вопрос, который мы рассмотрим в отношении целых чисел, – это преобразование типов . В языке Си ++ допустимо смешивать в выражении различные целые типы. Например, вполне допустимо записать x + y , где x типа short, а y – типа long. При выполнении операции сложения величина переменной x преобразуется к типу long. Такое преобразование можно произвести всегда, и оно безопасно, т.е. мы не теряем никаких значащих цифр. Общее правило преобразования целых типов состоит в том, что более короткий тип при вычислениях преобразуется в более длинный. Только при выполнении присваивания длинный тип может преобразовываться в более короткий. Например:

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

    ТИПЫ ДАННЫХ И ОПЕРАЦИИ В ЯЗЫКЕ СИ. ВЫРАЖЕНИЯ

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

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

    Описание состоит из спецификатора типа и следующего за ним списка переменных. Переменные в списке разделяются запятыми. В конце описания ставится точка с запятой.

    char a,b; /* Переменные а и b имеют тип

    char */ intх; /* Переменная х — типа int

    */ char sym; /» Описаны переменные sym типа char;

    */ int count.num; /* num и count типа int */

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

    Примеры: char backch = ‘’;

    Рассмотрим основные типы в языке Си.

    int — целый («integer»). Значения этого типа — целые числа из некоторого ограниченного диапазона (обычно от- 32768 до 32767). Диапазон определяется размером ячейки для типа и зависит от конкретного компьютера. Кроме того, имеются служебные слова, которые можно использовать с типом int: short int («short integer» — «короткое целое»), unsigned int («unsigned integer» — «целое без знака»), long int («длинное целое»), которые сокращают или, наоборот, расширяют диапазон представления чисел.

    char— символьный («character»). Допустимое значение для этоготипа — одинсимвол (не путать с текстом!). Символ записывается в апострофах.

    В памяти компьютера символ занимает один байт. Фактически хранится не символ, а число — код символа (от 0 до 255). В специальных таблицах кодировки указываются все допустимые символы и соответствующие им коды.

    В языке Си разрешается использовать тип char как числовой, т. е. производить операции с кодом символа, применяя при этом спецификатор целого типа в скобках — (int).

    float — вещественный (с плавающей точкой). Значения этого типа — числа, но, в отличии от char и int, не обязательно целые.

    12.87 -316.12 -3.345е5 12.345e-15

    double — вещественные числа двойной точности. Этот тип аналогичен типу float, но имеет значительно больший диапазон значений (например, для системы программирования Borland-C от 1.7Е-308 до 1.7Е+308 вместо диапазона от 3.4Е-38 до 3.4Е+38 для типа float). Однако увеличение диапазона и точности представления чисел ведет к снижению скорости выполнения программ и неэкономному использованию оперативной памяти компьютера.

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

    Необходимо отметить, что последним элементом массива является символ . Это «нуль-символ», и в языке Си он используется для того, чтобы отмечать конец строки. Нуль-символ не цифра 0; он не выводится на печать и в таблице кодов ASCII имеет номер 0. Наличие нуль-символа означает, что количество ячеек массива должно быть. по крайней мере, на одну больше,чем число символов, которые необходимо размещать в памяти.

    Приведем пример использования строк.

    В этом примере описан массив из 31 ячейки памяти, в 30 из которых можно поместить один элемент типа char. Он вводится при вызове функции scanf(«%s»,string); «&»отсутствует при указании массива символов.

    Указатели. Указатель — некоторое символическое представление адресаячейкипамяти, отведенной для переменной.

    Здесь & — операция получения адреса. Фактический адрес — это число, а символическое представление адреса &name является константой типа «указатель».

    В языке Си имеются и переменные типа указатель. Точно так же, как значением переменной типа char является символ, а значением переменной типа int — целое число, значением переменной типа указатель служит адрес некоторой величины.

    Если мы дадим указателю имя ptr, то сможем написать такой оператор:

    ptr = &name;/* присваивает адрес name переменной ptr */

    Мы говорим в этом случае, что prt «указатель на» name. Различие между двумя формами записи: ptr и &name — в том, что prt — это переменная, в то время как &name — константа. В случае необходимости можно сделать так, чтобы переменная ptr указывала на какой-нибудь другой объект:

    ptr = &bah; /* ptr указывает на bah, а не на name */

    Теперь значением переменной prt является адрес переменной bah. Предположим, мы знаем, что в переменной ptr содержится ссылка на переменную bah. Тогда для доступа к значению этой переменной можно воспользоваться операцией «косвенной адресации» * :

    val = *ptr; /* определение значения, на которое указывает ptr */ Последние два оператора, взятые вместе, эквивалентны следующему:

    Итак, когда за знаком & следует имя переменной, результатом операции является адрес указанной переменной; &nurse дает адрес переменной nurse; когда за знаком * следует указатель на переменную, результатом операции является величина, помещенная в ячейку памяти с указанным адресом.

    ptr = &nuse; /* указатель на nurse */

    Результат- присваивание значения 22 переменной val.

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

    Примеры правильного описания указателей: int *pi; char *pc;

    Спецификация типа задает тип переменной, на которую ссылается указатель, а символ * определяет саму переменную как указатель. Описание вида int *pi; говорит, что pi — это указатель и что *pi — величина типа int.

    В языке Си предусмотрена возможность определения имен типов данных. Любому типу данных с помощью определения typedef можно присвоить имя и использовать это имя в дальнейшем при описании объектов.

    Формат: typedef Пример: typedef long LARGE; /* определяется тип large, эквивалентный типу long */

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

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

    Операции. Язык Си отличается большим разнообразием операций (более 40). Здесь мы рассмотрим лишь основные из них, табл. 3.3.

    Арифметические операции. К ним относят

    • остаток от деления нацело (%),

    В языке Си принято правило: если делимое и делитель имеют тип int, то деление производится нацело, т е. дробная часть результата отбрасывается.

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

    5 = -3 + 4 * 5 — 6; printf(«%dn»,s);

    s = -3 + 4%5 — 6; printf(«%dn»,s);

    s = -3 * 4% — 6/5; printf(«%dn»,s);

    s= (7 + 6)%5/2; printf(«%dn»,s);

    Результат выполнения программы: 11 1 0 1

    Таблица 3.3 Старшинство и порядок выполнения операций

    ПриоритетОперацияНазваниеПорядок выполнения
    Высший() [] ++ — (тип) *Круглые скобки Квадратные скобки Увеличение Уменьшение Приведение СодержимоеСлева направо Слева направо Справа налево Справа налево Справа налево Справа налево
    & ! /

    sizeof *

    Адрес Унарный минус Логическое «НЕ» Инверсия битов Размер объекта УмножениеСправа налево Справа налево Справа налево Справа налево Справа налево Слева направо
    %Деление ОстатокСлева направо Слева направо
    + —Сложение ВычитаниеСлева направо Слева направо
    » « >Сдвиг вправо Сдвиг влево БольшеСлева направо Слева направо Слева направо
    >=

    Не нашли то, что искали? Воспользуйтесь поиском:

    Лучшие изречения: Да какие ж вы математики, если запаролиться нормально не можете. 8826 — | 7636 — или читать все.

    ТИПЫ ДАННЫХ И ОПЕРАЦИИ В ЯЗЫКЕ СИ. ВЫРАЖЕНИЯ

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

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

    Описание состоит из спецификатора типа и следующего за ним списка переменных. Переменные в списке разделяются запятыми. В конце описания ставится точка с запятой.

    char a,b; /* Переменные а и b имеют тип

    char */ intх; /* Переменная х — типа int

    */ char sym; /» Описаны переменные sym типа char;

    */ int count.num; /* num и count типа int */

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

    Примеры: char backch = ‘’;

    Рассмотрим основные типы в языке Си.

    int — целый («integer»). Значения этого типа — целые числа из некоторого ограниченного диапазона (обычно от- 32768 до 32767). Диапазон определяется размером ячейки для типа и зависит от конкретного компьютера. Кроме того, имеются служебные слова, которые можно использовать с типом int: short int («short integer» — «короткое целое»), unsigned int («unsigned integer» — «целое без знака»), long int («длинное целое»), которые сокращают или, наоборот, расширяют диапазон представления чисел.

    char— символьный («character»). Допустимое значение для этоготипа — одинсимвол (не путать с текстом!). Символ записывается в апострофах.

    В памяти компьютера символ занимает один байт. Фактически хранится не символ, а число — код символа (от 0 до 255). В специальных таблицах кодировки указываются все допустимые символы и соответствующие им коды.

    В языке Си разрешается использовать тип char как числовой, т. е. производить операции с кодом символа, применяя при этом спецификатор целого типа в скобках — (int).

    float — вещественный (с плавающей точкой). Значения этого типа — числа, но, в отличии от char и int, не обязательно целые.

    12.87 -316.12 -3.345е5 12.345e-15

    double — вещественные числа двойной точности. Этот тип аналогичен типу float, но имеет значительно больший диапазон значений (например, для системы программирования Borland-C от 1.7Е-308 до 1.7Е+308 вместо диапазона от 3.4Е-38 до 3.4Е+38 для типа float). Однако увеличение диапазона и точности представления чисел ведет к снижению скорости выполнения программ и неэкономному использованию оперативной памяти компьютера.

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

    Необходимо отметить, что последним элементом массива является символ . Это «нуль-символ», и в языке Си он используется для того, чтобы отмечать конец строки. Нуль-символ не цифра 0; он не выводится на печать и в таблице кодов ASCII имеет номер 0. Наличие нуль-символа означает, что количество ячеек массива должно быть. по крайней мере, на одну больше,чем число символов, которые необходимо размещать в памяти.

    Приведем пример использования строк.

    В этом примере описан массив из 31 ячейки памяти, в 30 из которых можно поместить один элемент типа char. Он вводится при вызове функции scanf(«%s»,string); «&»отсутствует при указании массива символов.

    Указатели. Указатель — некоторое символическое представление адресаячейкипамяти, отведенной для переменной.

    Здесь & — операция получения адреса. Фактический адрес — это число, а символическое представление адреса &name является константой типа «указатель».

    В языке Си имеются и переменные типа указатель. Точно так же, как значением переменной типа char является символ, а значением переменной типа int — целое число, значением переменной типа указатель служит адрес некоторой величины.

    Если мы дадим указателю имя ptr, то сможем написать такой оператор:

    ptr = &name;/* присваивает адрес name переменной ptr */

    Мы говорим в этом случае, что prt «указатель на» name. Различие между двумя формами записи: ptr и &name — в том, что prt — это переменная, в то время как &name — константа. В случае необходимости можно сделать так, чтобы переменная ptr указывала на какой-нибудь другой объект:

    ptr = &bah; /* ptr указывает на bah, а не на name */

    Теперь значением переменной prt является адрес переменной bah. Предположим, мы знаем, что в переменной ptr содержится ссылка на переменную bah. Тогда для доступа к значению этой переменной можно воспользоваться операцией «косвенной адресации» * :

    val = *ptr; /* определение значения, на которое указывает ptr */ Последние два оператора, взятые вместе, эквивалентны следующему:

    Итак, когда за знаком & следует имя переменной, результатом операции является адрес указанной переменной; &nurse дает адрес переменной nurse; когда за знаком * следует указатель на переменную, результатом операции является величина, помещенная в ячейку памяти с указанным адресом.

    ptr = &nuse; /* указатель на nurse */

    Результат- присваивание значения 22 переменной val.

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

    Примеры правильного описания указателей: int *pi; char *pc;

    Спецификация типа задает тип переменной, на которую ссылается указатель, а символ * определяет саму переменную как указатель. Описание вида int *pi; говорит, что pi — это указатель и что *pi — величина типа int.

    В языке Си предусмотрена возможность определения имен типов данных. Любому типу данных с помощью определения typedef можно присвоить имя и использовать это имя в дальнейшем при описании объектов.

    Формат: typedef Пример: typedef long LARGE; /* определяется тип large, эквивалентный типу long */

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

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

    Операции. Язык Си отличается большим разнообразием операций (более 40). Здесь мы рассмотрим лишь основные из них, табл. 3.3.

    Арифметические операции. К ним относят

    • остаток от деления нацело (%),

    В языке Си принято правило: если делимое и делитель имеют тип int, то деление производится нацело, т е. дробная часть результата отбрасывается.

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

    5 = -3 + 4 * 5 — 6; printf(«%dn»,s);

    s = -3 + 4%5 — 6; printf(«%dn»,s);

    s = -3 * 4% — 6/5; printf(«%dn»,s);

    s= (7 + 6)%5/2; printf(«%dn»,s);

    Результат выполнения программы: 11 1 0 1

    Таблица 3.3 Старшинство и порядок выполнения операций

    ПриоритетОперацияНазваниеПорядок выполнения
    Высший() [] ++ — (тип) *Круглые скобки Квадратные скобки Увеличение Уменьшение Приведение СодержимоеСлева направо Слева направо Справа налево Справа налево Справа налево Справа налево
    & ! /

    sizeof *

    Адрес Унарный минус Логическое «НЕ» Инверсия битов Размер объекта УмножениеСправа налево Справа налево Справа налево Справа налево Справа налево Слева направо
    %Деление ОстатокСлева направо Слева направо
    + —Сложение ВычитаниеСлева направо Слева направо
    » « >Сдвиг вправо Сдвиг влево БольшеСлева направо Слева направо Слева направо
    >=

    Не нашли то, что искали? Воспользуйтесь поиском:

    Лучшие изречения: Увлечёшься девушкой-вырастут хвосты, займёшься учебой-вырастут рога 10348 — | 8002 — или читать все.

    Читать еще:  Почему выбивает ошибку
    Ссылка на основную публикацию
    Adblock
    detector