
Лаба 4
.docxМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
Указатели и ссылки
Отчет по лабораторной работе №4
по дисциплине «Языки программирования»
Студент гр. 723-1
________
______2025г
Руководитель
младший научный сотрудник
_______ А.В. Куртукова
_______2025г
Введение
Цель работы:
Изучение механизмов работы указателей и ссылок
Задание
Изучить краткие теоретические сведения.
Подготовить примеры использования указателей и ссылок для языка C++ и языка программирования, определенного выбранным вариантом. Сравнить возможности языков. При этом продемонстрировать:
разницу между типизированными и нетипизированными указателями;
разницу между указателями на данные и на функции;
разницу между указателем и указуемым объектом;
разницу между указателями-константами и указателями на константу;
особенности работы с многоуровневыми указателями;
разницу между указателями и ссылками.
3. Написать отчет и защитить у преподавателя.
ХОД РАБОТЫ
1 Программа на С++
В данной лабораторной работе было написано два кода, на таких языках программирования как, C# (выбранный язык программирования) и С++ (по условию задания язык программирования).
В самом начале работы была создана программа на языке программирования C++, демонстрирующая работу указателей и ссылок.
Часть программы, показывающая разницу между типизированными и нетипизированными указателями (рисунок 1.1).
Рисунок 1.1 – Разница между типизированными и нетипизированными указателями
Часть программы, показывающая разницу между указателями на функции и указателями на данные (рисунок 1.2).
Рисунок 1.2 – Разница между указателями на функцию и на данные
Можно заметить, что для указателей на функции определена операция вызова функции.
Далее следует часть программы, демонстрирующая разницу между указателями и указуемыми объектами (рисунок 1.3).
Рисунок 1.3 – Разница между указателями и указуемыми объектами
На следующем этапе работы была создана часть программы, показывающая разницу между указателями-константами и указателями на константы (рисунок 1.4).
Рисунок 1.4 – Разница между указателями-константами и указателями на константы
Отличие заключается в том, что указатель-константа, в отличие от указуемого объекта нельзя изменять. Сам же указатель в данном случае может изменяться.
Далее были рассмотрены особенности работы с многоуровневыми указателями (рисунок 1.5).
Многоуровневые указатели представляют из себя указатели на указатели. В результате разыменования таких указателей получается адрес, который хранится в указателе уровнем ниже.
Рисунок 1.5 – Особенности работы с многоуровневыми указателями
На последнем этапе нужно было показать разницу между указателями и ссылками (рисунок 1.6).
Рисунок 1.6 – Разница между указателями и ссылками
Написанный код программы представлен в приложение А.
1 Программа на С#
На рисунке 1.7 представлен код сравнения типизированных и не типизированных указателей.
Рисунок 1.7 – Код сравнения типизированных и не типизированных указателей
На рисунке 1.8 представлен код разницы между указателями на функцию и на данные.
Рисунок 1.8 – Разница между указателями на функцию и на данные
На рисунке 1.9 представлен код разницы между указателем и указуемым объектом.
Рисунок 1.9 – Код разницы между указателем и указуемым объектом
На рисунке 1.10 представлены код указателя константы и указателя на константу.
Рисунок 1.10 – Разница между указателями-константами и указателями на константы
На рисунке 1.11 представлен код многоуровневого указателя.
Рисунок 1.11 – Код многоуровневого указателя
На рисунке 1.12 представлен код разницы между указателями и ссылками.
Рисунок 1.12 – Код разницы между указателями и ссылками.
Написанный код программы представлен в приложение Б.
1.3 Сравнение указателей и ссылок
Ниже представлено сравнение указателей и ссылок на языках программирования С++ и С#:
1)Оба языка поддерживают типизированные указатели, но C# не поддерживает нетипизированные указатели.
2)C++ поддерживает указатели на данные и функции, в то время как C# поддерживает только указатели на данные.
3)C++ поддерживает ссылки как доказуемые объекты, в то время как C# использует ссылки на объекты в качестве ссылок.
4)Оба языка поддерживают постоянные указатели.
5)Только С++ поддерживает указатели на константу.
6)Оба языка поддерживают многоуровневые указатели.
Заключение
В ходе лабораторной работы были применены полученные знания о том, что такое указатель и ссылка, а также была продемонстрирована разница в использовании ссылок и указателей в двух языках программирования.
Приложение А
Программа на C++
#include <iostream>
using namespace std;
int multiplier(int digit)
{
int result = digit * 100; return result;
}
int main()
{
int x = 10;
int y = 20;
cout << "#1" << endl;
int* ptr_1 = &x;
void* ptr_2 = &y;
cout << "x = " << *ptr_1 << endl;
cout << "y = " << y << endl;
cout << "x адрес: " << ptr_1 << endl;
cout << "y адрес: " << ptr_2 << endl << endl;
cout << "#2" << endl;
int (*ptr_f) (int);
ptr_f = multiplier;
cout << "указатель на функцию: " << ptr_f(y) << endl;
cout << "указатель на данные: " << *ptr_1 << endl << endl;
cout << "#3" << endl;
cout << "указатель на x: " << ptr_1 << ", x = " << x << endl;
cout << "указатель на y: " << ptr_2 << ", y = " << y << endl << endl;
cout <<"#4"<< endl;
const int cnst_x = 123;
const int* ptr_cnst = &y;
cout <<"constant-pointer to y: " << ptr_cnst << ", y = " << *ptr_cnst << endl;
y = y *100;
cout <<"constant-pointer to new y: " << ptr_cnst << ", y = " << *ptr_cnst <<endl;
const int* ptr_to_cnst = &cnst_x;
cout <<"constant address: " << ptr_to_cnst << ", constant: " << *ptr_to_cnst << endl << endl;
cout <<"#5" << endl;
int** multi_ptr = &ptr_1;
cout <<"pointer to a pointer: " << multi_ptr << endl;
cout << "pointer to a value : " << ptr_1 << endl;
cout << "value: " << **multi_ptr << endl << endl;
cout <<"#6" << endl;
int& link = y;
cout <<"pointer to y: " << ptr_2 << endl;
cout <<"link to y: " << link << endl;
link +=100;
cout <<"link was changed: " << link << endl;
}
Приложение Б
Программа на C#
using System;
unsafe class Program
{
static int Multiplier(int digit)
{
return digit * 100;
}
static void Main()
{
int x = 10;
int y = 20;
Console.WriteLine("#1");
int* ptr_1 = &x;
Console.WriteLine($"x = {*ptr_1}");
Console.WriteLine($"адрес х: {(IntPtr)ptr_1}");
void* ptr_2 = &y;
Console.WriteLine($"y = {y}");
Console.WriteLine($"адрес у: {(IntPtr)ptr_2}");
//Console.WriteLine($"unnamed x: {*ptr_2}");
Console.WriteLine("При попытке разыменовать указатель y будет ошибка\n");
Console.WriteLine("#2");
Func<int, int> ptr_f = Multiplier;
Console.WriteLine($"указатель на функцию(делегат): {ptr_f(x)}");
Console.WriteLine($"указатель на x: {(IntPtr)ptr_1}\n");
Console.WriteLine("#3");
Console.WriteLine($"указатель на x: {(IntPtr)ptr_1}, указуемый объект = {x}");
Console.WriteLine($"указатель на y: {(IntPtr)ptr_2}, yказуемый объект = {y}\n");
Console.WriteLine("#4");
int cnst_x = 123;
int* ptr_to_const = &cnst_x;
Console.WriteLine($"ptr_to_const указатель на константный x = {*ptr_to_const}");
ptr_to_const = &y;
Console.WriteLine($"Новый адрес для x (взят от y) = {*ptr_to_const}");
int* const_ptr = &x;
*const_ptr = x;
Console.WriteLine($"const_ptr указатель на x = {*const_ptr}");
*const_ptr = 40;
Console.WriteLine($"Смена значения указуемого объекта = {x}\n");
Console.WriteLine("#5");
int** multi_ptr = &ptr_1;
Console.WriteLine($"Указатель на указатель: {(IntPtr)multi_ptr}");
Console.WriteLine($"Указатель на данные: {(IntPtr)(*multi_ptr)}");
Console.WriteLine($"значение: {**multi_ptr}\n");
Console.WriteLine("#6");
ref int link = ref y; // Ссылка
Console.WriteLine($"ссылка на y: {link}");
link += 100;
Console.WriteLine($"измененная ссылка: {link}");
Console.WriteLine($"y was changed: {y}");
}
}
Томск 2025