-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Тема лабораторной работы: Указатели, арифметика указателей
Задача 1: Работа с указателями
Постановка задачи:
Внутри функции int main(void) { /*...*/ } определите указатель double ***pointer = NULL;. Инициализируйте этот указатель адресом другого указателя типа double **, который указывает на переменную double *, которая указывает на double. Используйте pointer для записи и чтения значения 2.0 в сегмент оперативной памяти для double.
Математическая модель:
pointer— указатель на указатель на указатель наdouble.pointerдолжен быть инициализирован так, чтобы он указывал наdouble **, который указывает наdouble *, который указывает наdouble.
Список идентификаторов:
| Имя переменной | Тип данных | Описание |
|---|---|---|
| pointer | double *** | Указатель на указатель на указатель на double |
| ptr2 | double ** | Указатель на указатель на double |
| ptr1 | double * | Указатель на double |
| value | double | Переменная типа double |
Код программы:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
double ***pointer = NULL;
double **ptr2 = (double **)malloc(sizeof(double *));
double *ptr1 = (double *)malloc(sizeof(double));
*ptr1 = 2.0;
*ptr2 = ptr1;
pointer = &ptr2;
printf("Значение: %f\n", ***pointer);
free(ptr1);
free(ptr2);
return 0;
}Результаты работы программы:
Значение: 2.000000
Задача 2: Сложение двух чисел
Постановка задачи:
Напишите программу, которая складывает два числа с использованием указателей на эти числа.
Математическая модель:
- Используем указатели для доступа к значениям переменных и их сложения.
Список идентификаторов:
| Имя переменной | Тип данных | Описание |
|---|---|---|
| a | int | Первое число |
| b | int | Второе число |
| sum | int | Результат сложения |
| ptr_a | int * | Указатель на первое число |
| ptr_b | int * | Указатель на второе число |
Код программы:
#include <stdio.h>
int main(void) {
int a = 5, b = 10;
int *ptr_a = &a, *ptr_b = &b;
int sum = *ptr_a + *ptr_b;
printf("Сумма: %d\n", sum);
return 0;
}Результаты работы программы:
Сумма: 15
Задача 3: Нахождение максимума из двух чисел
Постановка задачи:
Напишите программу, которая находит максимальное число из двух чисел, используя указатели на эти числа.
Математическая модель:
- Используем указатели для сравнения значений двух переменных.
Список идентификаторов:
| Имя переменной | Тип данных | Описание |
|---|---|---|
| a | int | Первое число |
| b | int | Второе число |
| max | int | Максимальное значение |
| ptr_a | int * | Указатель на первое число |
| ptr_b | int * | Указатель на второе число |
Код программы:
#include <stdio.h>
int main(void) {
int a = 5, b = 10;
int *ptr_a = &a, *ptr_b = &b;
int max = (*ptr_a > *ptr_b) ? *ptr_a : *ptr_b;
printf("Максимум: %d\n", max);
return 0;
}Результаты работы программы:
Максимум: 10
Задача 4: Динамический массив с плавающей точкой
Постановка задачи:
Напишите программу, которая создаёт одномерный динамический массив из чисел с плавающей точкой двойной точности, заполняет его значениями с клавиатуры и распечатывает все элементы этого массива, используя арифметику указателей (оператор +), а не оператор доступа к элементу массива [ ].
Математическая модель:
- Используем динамическое выделение памяти для массива и арифметику указателей для доступа к элементам.
Список идентификаторов:
| Имя переменной | Тип данных | Описание |
|---|---|---|
| arr | double * | Указатель на массив |
| n | int | Размер массива |
| i | int | Счётчик цикла |
Код программы:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n;
printf("Введите размер массива: ");
scanf("%d", &n);
double *arr = (double *)malloc(n * sizeof(double));
if (arr == NULL) {
printf("Ошибка выделения памяти\n");
return 1;
}
printf("Введите элементы массива:\n");
for (int i = 0; i < n; i++) {
scanf("%lf", arr + i);
}
printf("Элементы массива:\n");
for (int i = 0; i < n; i++) {
printf("%.2f ", *(arr + i));
}
printf("\n");
free(arr);
return 0;
}Результаты работы программы:
Введите размер массива: 3
Введите элементы массива:
1.1 2.2 3.3
Элементы массива:
1.10 2.20 3.30
Задача 5: Обратный порядок элементов массива
Постановка задачи:
Выведите элементы динамического массива целых чисел в обратном порядке, используя указатель и операцию декремента (--).
Математическая модель:
- Используем указатель для доступа к элементам массива в обратном порядке.
Список идентификаторов:
| Имя переменной | Тип данных | Описание |
|---|---|---|
| arr | int * | Указатель на массив |
| n | int | Размер массива |
| i | int | Счётчик цикла |
Код программы:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n;
printf("Введите размер массива: ");
scanf("%d", &n);
int *arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("Ошибка выделения памяти\n");
return 1;
}
printf("Введите элементы массива:\n");
for (int i = 0; i < n; i++) {
scanf("%d", arr + i);
}
printf("Элементы массива в обратном порядке:\n");
for (int i = n - 1; i >= 0; i--) {
printf("%d ", *(arr + i));
}
printf("\n");
free(arr);
return 0;
}Результаты работы программы:
Введите размер массива: 3
Введите элементы массива:
1 2 3
Элементы массива в обратном порядке:
3 2 1
Задача 6: Побайтовый вывод переменной
Постановка задачи:
Определите переменную целого типа int a = 1234567890; и выведите побайтово её содержимое на экран, используя указатель char *.
Математическая модель:
- Используем указатель типа
char *для доступа к каждому байту переменной типаint.
Список идентификаторов:
| Имя переменной | Тип данных | Описание |
|---|---|---|
| a | int | Переменная типа int |
| byte_ptr | char * | Указатель на байт |
Код программы:
#include <stdio.h>
int main(void) {
int a = 1234567890;
char *byte_ptr = (char *)&a;
printf("Побайтовый вывод переменной a:\n");
for (int i = 0; i < sizeof(int); i++) {
printf("Байт %d: %d\n", i, *(byte_ptr + i) & 0xFF);
}
return 0;
}Результаты работы программы:
Побайтовый вывод переменной a:
Байт 0: 210
Байт 1: 2
Байт 2: 150
Байт 3: 73
Задача 7: Двумерный динамический массив
Постановка задачи:
Выделите память под двумерный динамический массив, используя массив указателей на строки, и затем корректно освободите оперативную память.
Математическая модель:
- Используем массив указателей для создания двумерного массива и освобождаем память в обратном порядке.
Список идентификаторов:
| Имя переменной | Тип данных | Описание |
|---|---|---|
| arr | int ** | Указатель на массив указателей |
| rows | int | Количество строк |
| cols | int | Количество столбцов |
| i | int | Счётчик цикла |
Код программы:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int rows = 3, cols = 4;
int **arr = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {
arr[i] = (int *)malloc(cols * sizeof(int));
}
// Заполнение массива
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
arr[i][j] = i * cols + j;
}
}
// Вывод массива
printf("Массив:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
// Освобождение памяти
for (int i = 0; i < rows; i++) {
free(arr[i]);
}
free(arr);
return 0;
}Результаты работы программы:
Массив:
0 1 2 3
4 5 6 7
8 9 10 11
Информация о студенте:
Киселев Г. П., 1 курс, ИВТ-1.1