- •Типы данных в C
- •Целые типы данных
- •Знаковые и беззнаковые типы
- •Вещественные типы данных
- •Вычисление арифметических выражений
- •Указатели
- •Выражения, содержащие указатели
- •Преобразование типов указателей
- •Адресная арифметика
- •Пример использования указателей
- •Перечислимый тип
- •Тип void
- •Структура программы на языке C
- •Функция пользователя
- •Функция, не возвращающая значение
- •Функция с параметрами, возвращающая значение
- •Массивы
- •Доступ к элементу массива
- •Примеры
- •Обращение к элементу одномерного массива с помощью переменной- указателя
- •Двумерный массив
- •Доступ к элементу двумерного массива с помощью указателей
- •Комбинированные способы обращения к элементам двумерного массива
- •Задача
- •Параметры функции
- •Передача параметра-значения
- •Передача параметра-указателя
- •Передача параметра-ссылки
- •Пердача в функцию одномерного массива
- •Задача
- •Генератор случайных чисел
- •Решение задачи (1)
- •Решение задачи (2)
- •Решение задачи (3)
- •Решение задачи (4)
- •Решение задачи (5)
- •Результат работы программы
- •Передача в функцию двумерного массива
- •Задача
- •Решение задачи (1)
- •Решение задачи (2)
- •Решение задачи (3)
- •Решение задачи (4)
- •Решение задачи (5)
- •Объявление пользовательского типа
- •Методы программирования
- •Конструирование программы для обработки двумерного массива
- •MyModul.h
- •Main.cpp
- •MyModul.h (2 редакция)
- •Задача
- •Строки в C
- •Ввод и вывод строк
- •Функции для обработки строк
- •Пример обработки строк
- •Массивы строк
- •Обработка символов в строках
- •Пример распознавания символов
- •Разбиение строки на лексемы
- •Результат работы программы
- •Структуры
- •Объявление тега структуры (синоним типа)
- •Анонимный тип структуры
- •Инициализация структурной переменной
- •Действия над структурами
- •Задача
- •Передача в функцию структурной переменной
- •Вложенные структуры
- •Массив структур
- •Передача в функцию массива структур
- •void input_struct(struct Person* P, int n)
- •Объединения
- •Пример программы
- •Инициализация объединения
Типы данных в C
Простые типы
Целые
Вещественные
Указатели
Перечислимый тип
Пустой тип (void)
Составные типы
массивы
структуры
объединения
Целые типы данных
char |
1 |
байт |
short |
2 |
байта |
long |
4 |
байта |
int |
платформозависимый тип |
sizeof int - определение размера памяти, выделяемой для переменной заданного типа
Знаковые и беззнаковые типы
signed unsigned
signed char ch; // -128 .. 127
unsigned char ch; // 0 .. 255
signed short s; // -32 768 .. 32 767
unsigned short s; // 0 .. 65 535
signed int d; // -2 147 483 648 .. 2 147 483 647
unsigned int d; // 0 .. 4 294 967 295
Вещественные типы данных
float — 4 байта (3.4 *10-38 до 3.4*10+38) double — 8 байтов (1.7 *10-308 до 1.7*10+308) long double — 10 байтов
Формат числа с плавающей точкой:
+/- m*2 p
Где 2 — основание системы счисления, m — мантисса, p - показатель степени
float:
Знак - 1бит
Вычисление арифметических выражений
1. Неявное преобразование типов
Приоритеты типов данных, используемые для неявного преобразования:
long double → double → float → unsigned long (int) → signed long (int) → unsigned short → signed short → unsigned char → signed char
2. Явное преобразование типов
int b; double f = 13.25; b = (int) f %10;
3. Приоритеты арифметических операций:
1. ++ -- 2. * / % 3. + - 4. = *= /= %= += -=
Указатели
Объявление типизированного указателя:
int* ptr; float* ptr; char* ptr;
Объявление бестипового указателя:
void* ptr;
Инициализация переменной-указателя:
int a = 5; int* ptr = &a;
Косвенная адресация: int b = *ptr;
a : 5 b : *ptr
ptr : адрес a
Выражения, содержащие указатели
int a = 10, b = 5; int * ptra = &a; int* ptrb = &b;
*ptrb = *ptra + 2 * *ptrb;
Замечание: нельзя получить адрес константного значения, арифметического выражения, регистровой переменной.
Преобразование типов указателей
старший байт |
младший байт |
unsigned int a = 0xddcc; void* ptr = &a;
0unsigned0 0 0 0 0 0 0char0 0 0ch0 0=0 *0(unsigned0 1 1 0 1 1 1char*0 1 1 )ptr;1 0 0 1
printf(''%x %d'', a, ch);
ptr
1 0 0
На экране: ddcc 204
Адресная арифметика
Операции над указателями:
присваивание |
ptr1 = ptr2; |
инкремент |
ptr1++; |
декремент |
ptr1--; |
сложение |
ptr2 = ptr1 + 2; |
вычитание |
ptr2 = ptr1 — 3; |
где ptr1 и ptr2 — типизированные* указатели
Пример использования указателей
Задача: в вещественную переменную ввести число. Просмотреть содержимое каждого байта указанной переменной.
#include <stdio.h> |
Ввели: 0.21875 (0.001112) |
|
|
||
Ответ: |
2 байт — 0 |
3 байт — 96 |
4 байт - 62 |
||
int main() |
|
1 байт — 0 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
Ввели: -0.21875 (-0.001112) |
|
|||
float num; |
|
|
|||
|
Ответ: |
|
|
|
|
scanf("%f",&num); |
1 байт — 0 |
2 байт — 0 |
3 байт — 96 |
4 байт - 190 |
|
|
|
|
|
||
unsigned char*pbyte=(unsigned char*)# |
|
||||
printf("1 byte |
%u |
", *pbyte); |
|
|
|
printf("2 byte |
%u |
", *(pbyte+1)); |
|
|
|
printf("3 byte |
%u |
", *(pbyte+2)); |
|
|
|
printf("4 byte |
%u |
", *(pbyte+3)); |
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|