Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаба 4

.docx
Скачиваний:
0
Добавлен:
15.03.2025
Размер:
443.05 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования

«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)

Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)

Указатели и ссылки

Отчет по лабораторной работе №4

по дисциплине «Языки программирования»

Студент гр. 723-1

________

______2025г

Руководитель

младший научный сотрудник

_______ А.В. Куртукова

_______2025г

Введение

Цель работы:

Изучение механизмов работы указателей и ссылок

Задание

  1. Изучить краткие теоретические сведения.

  2. Подготовить примеры использования указателей и ссылок для языка C++ и языка программирования, определенного выбранным вариантом. Сравнить возможности языков. При этом продемонстрировать:

    1. разницу между типизированными и нетипизированными указателями;

    2. разницу между указателями на данные и на функции;

    3. разницу между указателем и указуемым объектом;

    4. разницу между указателями-константами и указателями на константу;

    5. особенности работы с многоуровневыми указателями;

    6. разницу между указателями и ссылками.

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

Соседние файлы в предмете Языки программирования