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

ЯП лаба 4

.docx
Скачиваний:
2
Добавлен:
03.11.2023
Размер:
24.07 Кб
Скачать

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)

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

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

Отчет по лабораторной работе №4 по дисциплине «Языки программирования»

Студент гр. ***-*

________.2023

Принял

Кандидат Технических наук, Доцент каф. КИБЭВС

__________

________ А.С. Романов

________.2023

2023

Введение

Цель работы: изучение механизмов работы указателей и ссылок.

Указатели – это переменная, значением которой является адрес другой переменной. Указатель ссылается на блок данных из области памяти, причём на самое его начало. Значение указательного (ссылочного) типа (pointer type) – это адрес. Объект, на который указывают, называется указуемым или обозначаемым объектом (designated object). Различают типизированные и нетепизированные (void *) указатели, указатели на данные и на функции. При этом множества допустимых операций для указателей разных видов различны. Размер (формат) адреса зависит только от величины адресного пространства компьютера и специфики его организации. Указатель позволяет предоставить косвенный доступ к элементам известного типа (типизированное средство косвенного доступа к объектам данных).

Ссылка - тип данных, являющийся скрытой формой указателя, который при использовании автоматически разыменовывается. Основное назначение ссылки - организации прямого доступа к тому, или иному объекту, в отличии от указателя, который предоставляет косвенный доступ. Главное отличие состоит во внутреннем механизме работы: указатели ссылаются на участок в памяти, используя его адрес, а ссылки ссылаются на объект, по его имени (тоже своего рода адрес). Ссылка может быть объявлена как другим именем, так и псевдонимом переменной, на которую ссылается.

2 Ход работы

В качестве языков программирования, на которых будет продемонстрирована работы ссылок и указателей, были выбраны Python и C++.

В C++ взять адрес любой переменный можно с помощью операции взятия адреса «&». Данная операция вернет указатель.

Указатели – отдельный вид переменных, существует типизированные указатели (int, char, string, double и т.д), также нетипизированный – void.

Пример:

int a = 5;

int *b = &a; (здесь указатель b хранит в себе адрес переменной a).

Все переменные в Python – это ссылки, которые ссылаются на один объект, а не на участок памяти как в С/C++. В Python есть изменяемые и неизменяемые типы. Изменяемые отличаются тем, что их содержимое можно сменить, не изменив ссылку на них. Неизменяемые объекты приходится пересоздавать, чтобы отразить изменения состояния. При этом все старые ссылки не видят это обновление, потому что указывают на старый объект. Списки, словари, множества – это изменяемые объекты. Числа, строки, кортежи – это неизменяемые объекты.

В приложении А и Б представлена работы с указателями и ссылки в C++ и Python соответственно.

Заключение

В ходе данной лабораторной работе были изучены механизмы работы указателей и ссылок.

Приложение А

(Обязательное)

Листинг кода на C++

#include <iostream>

using namespace std;

void f(int a, int b)

{

cout << a + b << endl;

}

int main()

{

int a = 10;

int* pa = &a;

cout << pa << endl; // типизированный указатель

int b = 15;

int* pb = &b;

void* pb2 = pb; // нетипизированный

cout << pb2 << " " << pb << endl;

int c = 20;

int* pc = &c; // указатель на данные

*pc = 2;

cout << *pc << " " << c << endl;

void(*plus)(int, int);

plus = f; // указатель на функцию

plus(2, 3);

// *pc = c , где pc указатель, а с указуемый объект

const int d = 25;

const int* pd = &d;

// *pd = 10; - не можем изменить

// d = 15; - не можем

int e = 30;

const int* pe = &e;

// *pe = 20; - не можем

// e = 13; - можем

int f = 100;

int* pf = &f;

int** ppf = &pf;

cout << ppf << endl; // указатель на ссылку области памяти на ссылку области памяти в которой хранится f

cout << *ppf << " " << &f << endl; // указатель на ссылку области памяти в которой f

cout << **ppf << " " << f << endl; // указатель на значение f

// разница

double x = 3.111;

double y = 9.111;

double&myref = x;

// int& myref = y; - ссылку переопределить нельзя

cout << myref << endl;

double z = 3.111;

double r = 9.111;

double* pz = &z; // указатель можно переопределить, изменить значение ячейки

// на область памяти которой он указывает

pz = &r;

*pz = 21.567;

cout << *pz << endl;

// указатель может = null, ссылка всегда есть

// указатель имеет ссылку, ссылка это и есть ссылка

}

Приложение Б

(Обязательное)

Листинг кода на Python

x = 10 y = 10 print('Область памяти переменной x:', hex(id(x))) print('Область памяти переменной y:', hex(id(y))) x += 20 print('\nОбласть памяти переменной x:', hex(id(x))) print('Область памяти переменной y:', hex(id(y))) x1 = [11, 13, 15] y1 = x print('\nОбласть памяти переменной x:', hex(id(x1))) print('Область памяти переменной y:', hex(id(y1))) y2 = [11, 13, 15] print('\nОбласть памяти переменной x:', hex(id(x1))) print('Область памяти переменной y:', hex(id(y2))) x2 = y2.copy() print('\nОбласть памяти переменной x:', hex(id(x2))) print('Область памяти переменной y:', hex(id(y2))) x3 = 10500 y3 = 10001 + 499 print('\nОбласть памяти переменной x:', hex(id(x3))) print('Область памяти переменной y:', hex(id(y3))) w = 'helloworld' z = 'helloworld' print('\nОбласть памяти переменной w:', hex(id(w))) print('Облатсь памяти переменной z:', hex(id(z))) w1 = 'helloworld' z1 = 'hello' + 'world' print('\nОбласть памяти переменной w:', hex(id(w1))) print('Облатсь памяти переменной z:', hex(id(z1)))

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