
laba4
.pdf
Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра безопасности информационных систем (БИС)
УКАЗАТЕЛИ И ССЫЛКИ
Отчет по лабораторной работе №4 по дисциплине «Языки программирования»
Выполнил:
Студент гр. 730-2
____Подойницын К.В.
18.04.2022
Принял:
Преподаватель кафедры КИБЭВС
Полюга В.А. 18.04.2022
Томск 2022
2
1 Введение
Цель работы: изучение механизмов работы указателей и ссылок.

3
2 Ход работы
В данной лабораторной работе производится знакомство с механизмами работы указателей и ссылок в разных языках программирования. В качестве языка программирования был выбран C++ и C#.
2.1 Типизированный и нетипизированный указатель
Пример кода на C# приведен на рисунке 2.1.
Рисунок 2.1 – Пример кода на C#.
Рисунок 2.2 – Пример кода на C++.
2.2 Указатель на функцию
Пример кода на C# приведен на рисунке 2.3.
Рисунок 2.3 – Пример кода на C#.

4
Рисунок 2.4 – Пример кода на C++.
2.3Указатель константа и указатель на константу
ВC# нет указателей констант и указателей на константу. Поэтому приведем пример кода на C++.
Рисунок 2.5 – Пример кода на C++.
2.4 Ссылки
Ссылка - тип данных, являющийся скрытой формой указателя, который при использовании автоматически разыменовывается.
Основное назначение ссылки - организации прямого доступа к тому, или иному объекту, в отличии от указателя, который предоставляет косвенный доступ.
Рисунок 2.6 – Пример кода на C++.

5
Рисунок 2.7 – Пример кода на C#.
2.5 Многоуровневые указатели
Рисунок 2.8 – Пример кода на C++.
Рисунок 2.9 – Пример кода на C#.
6
Заключение В процессе выполнения лабораторной работы было произведено
знакомство с механизмами работы указателей и ссылок в языках программирования C++ и C#.
7
Приложение А
(Обязательное)
Листинг программы
#include <iostream> #include <iomanip> using namespace std;
int vichitanie(int m, int n)
{
return n - m;
}
int main()
{
setlocale(LC_ALL, "ru");
void* void_ptr; // нетепизированный указатель int* int_ptr; // типизированный ук. на тип int
char* char_ptr; // типизированный указатель на char void_ptr = int_ptr; // правильно
char_ptr = void_ptr; // правильно в С, но ошибка С++ char_ptr = int_ptr; // предупреждение в С, ошибка в С++
//указатели на функции int m = 7;
int n = 14;
int (*k)(int m, int n); //объявление указавтеля k = vichitanie; // указатель на функцию
k(m, n); // вызов функции
//разница между указателями и указуемым объектом int m = 7;
int n = 14;
int* ptr1 = &m; // ptr1 указывает на m int* ptr2 = &n; // ptr2 указывает на n
if (ptr1 > ptr2) {}; // правильно т.к. ptr1>ptr2
if (*ptr1 > *ptr2) {}; // сравнение самих переменных, неправильно
*ptr1 = *ptr2; // косвенно приравниваем m=n=14.
if (ptr1 == ptr2) {}; // неправильно , указатели до сих пор разные if (*ptr1 == *ptr2) {}; // правильно , обознач. объекты равны
ptr1 = ptr2; // указывают на адрес ptr1
//разница между указателями-константами и указателями на константу int m, n;
int* const p1 = &m; // указатель-константа const int* p2 = &m; // указатель на константу
const int* const p3 = &m; // указатель-константа на константу *p1 = 5; // правильно, данный объект не является const
p2 = &n; // правильно, указатель не является const *p2 = 5; // ошибка, указуемый объект – константа p3 = &n; // ошибка, указатель-константа
*p3 = 5; // ошибка, указуемый объект - константа
//многоуровневые указатели
int var = 12345; // объявление переменной var int* ptr1 = &var; // указатель на переменную var
int** ptr2 = &ptr1; // указатель на указатель на var cout << var << endl;
cout << *ptr1 << endl;
cout << **ptr2 << endl; // два раза разименовываем указатель cout << "\n **ptr2 -> *ptr1 -> var" << var << endl;
cout << &ptr1 << " -> " << &var << " -> " << var << endl;
// ссылки
int value = 30;
int& ref = value; // присвоение ссылке значения переменной value cout << "value = " << value << endl;
8
cout << "reference = " << ref << endl;
ref += 30; // изменяем значение переменной value cout << "value = " << value << endl;
cout << "reference = " << ref << endl;
}
using System;
using System.Runtime.InteropServices;
namespace YAP_Laba_4
{
class Program
{
static int Vichitanie(int m, int n)
{
return n - m;
}
delegate int dlg(int m, int n); static void Main(string[] args)
{
unsafe
{
{
// разница между тип и нетип указателями int m = 7;
void* void_ptr; // нетепизированный указатель
int* int_ptr = &m; // типизированный ук. на тип int char* char_ptr; // типизированный указатель на char void_ptr = int_ptr; // правильно
char_ptr = void_ptr; // правильно в С, но ошибка С++ char_ptr = int_ptr; // предупреждение в С, ошибка в С++
}
{
// указатель на функцию int m = 7;
int n = 14;
dlg minus; // создание переменной делегат
minus = Vichitanie; // присвоение переменной адреса функции minus(m, n); // вызов функции
}
{
// разница между указателем и указуемым объектом int m = 7;
int n = 14;
int* ptr1 = &m; // ptr1 указывает на m int* ptr2 = &n; // ptr2 указывает на n
if (ptr1 > ptr2) { }; // правильно т.к. ptr1>ptr2
if (*ptr1 > *ptr2) { }; // сравнение самих переменных, неправильно
*ptr1 = *ptr2; // косвенно приравниваем m=n=14.
if (ptr1 == ptr2) { }; // неправильно , указатели до сих пор разные if (*ptr1 == *ptr2) { }; // правильно , обознач. объекты равны
ptr1 = ptr2; // указывают на адрес ptr1
}
{
// многоуровневые указатели
int var = 12345; // объявление переменной var int* ptr1 = &var; // указатель на переменную var
int** ptr2 = &ptr1; // указатель на указатель на var Console.WriteLine(var);
Console.WriteLine(*ptr1);
Console.WriteLine(**ptr2);
}
{
// ссылки
int value = 30;
ref int reference = ref value; Console.WriteLine($"ref = {value}"); Console.WriteLine($"ref = {reference}");
9
reference += 30; Console.WriteLine($"ref = {value}");
Console.WriteLine($"ref = {reference}");
}
}
}
}
}