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

laba4

.pdf
Скачиваний:
1
Добавлен:
12.12.2024
Размер:
542.79 Кб
Скачать

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

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

Кафедра безопасности информационных систем (БИС)

УКАЗАТЕЛИ И ССЫЛКИ

Отчет по лабораторной работе №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}");

}

}

}

}

}

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