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

ЯП Лабораторная работа 4

.pdf
Скачиваний:
0
Добавлен:
17.06.2025
Размер:
869.12 Кб
Скачать

Приложение А

Код программы на языке C++

#include <iostream>

void bananaQuote(); void bananaQuote() {

std::cout << "I'm not asleep, my mind is alive!";

}

int main()

{

setlocale(LC_ALL, "");

std::cout << "Разница между типизированными и нетипизированными указателями.\n";

// Типизированный указатель может указывать только на тот же тип int typed = 13;

int* typed_ptr = &typed;

std::cout << "Результат: " << *typed_ptr; std::cout << "\n";

// Нетипизированный указатель, для доступа к значению нужно приведение int untyped = 42;

void* untyped_ptr = &untyped;

int* int_pointer = static_cast<int*>(untyped_ptr); std::cout << "Результат: " << *int_pointer;

std::cout << "\n\nРазница между указателями на данные и на функции.\n";

// Указатель на данные, при выводе самого указателя выводится адрес, а не значение исходного объекта

int variable = 24;

int* data_ptr = &variable;

std::cout << "Результат: " << *data_ptr;

std::cout << "\n";

// Указатель на функцию, можно вызвать через него исходную функцию void (*func_ptr)() = bananaQuote;

func_ptr();

std::cout << "\n\nРазница между указателем и указуемым объектом.\n";

11

// ptr — это указатель, а *ptr — это значение объекта int value = 52;

int* ptr = &value;

std::cout << "Адрес: " << ptr << ", Значение: " << *ptr;

std::cout << "\n\nРазница между указателями-константами и указателями на константу.\n";

// Через указатель на константу нельзя изменить значение исходного объекта const int constant = 7132;

const int* constant_ptr = &constant;

std::cout << "Результат: " << *constant_ptr << "\n";

// Через константный указатель можно изменить значение исходного объекта, но нельзя изменить сам указатель

int value1 = 10; int value2 = 20;

int* const value1_ptr = &value1;

std::cout << "Результат: " << *value1_ptr << " --> "; *value1_ptr = 30;

std::cout << *value1_ptr;

//ptr = &value2; Ошибка: нельзя изменить сам указатель

std::cout << "\n\nОсобенности работы с многоуровневыми указателями.\n";

//Число символов * при объявлении указателя показывает порядок указателя.

//Чтобы получить доступ к значению, на которое ссылается указатель,

//его необходимо разыменовывать соответствующее количество раз.

int multilevel = 123;

int* multilevel_ptr = &multilevel; int** ptr_to_ptr = &multilevel_ptr;

std::cout << "Результат: " << *ptr_to_ptr << "\n"; std::cout << "Результат: " << **ptr_to_ptr;

std::cout << "\n\nРазница между указателями и ссылками.\n";

// Указатель – это переменная, значением которой является адрес другой переменной int pointer = 19;

int* pointer_ptr = &pointer;

std::cout << "Результат: " << *pointer_ptr; std::cout << "\n";

12

// Ссылка – переменная, являющаяся скрытой формой указателя, при использовании автоматически разыменовывается

int reference = 10;

int& reference_ref = reference;

std::cout << "Результат: " << reference << " --> "; reference_ref = 20;

std::cout << reference << "\n";

}

13

Приложение Б

Код программы на языке Java

interface BananaQuote { void sayTheQuote();

}

public class Main {

public static void main(String[] args) {

System.out.println("Разница между типизированными и нетипизированными указателями.");

// В Java нет указателей, но есть ссылки. Все ссылки типизированы. Integer typed = 13;

Integer typed_ref = typed; System.out.println("Результат: " + typed_ref);

System.out.println("\nРазница между указателями на данные и на функции.");

// В Java ссылки работают только с объектами, примитивные типы ими не

являются.

Integer variable = 24; Integer data_ref = variable;

System.out.println("Результат: " + data_ref);

// В Java нет указателей на функции, но можно использовать интерфейсы и лямбда-выражения.

BananaQuote bq = () -> System.out.println("I'm not asleep, my mind is

alive!");

bq.sayTheQuote();

System.out.println("\nРазница между указателем и указуемым объектом.");

// В Java ссылка всегда указывает на объект. Напрямую работать с адресами памяти нельзя.

Integer value = 52; Integer ref = value;

System.out.println("Переменная: " + value + ", Значение ссылки: " + ref);

System.out.println("\nРазница между указателями-константами и указателями на константу.");

// Константу нельзя изменить, ссылку можно. final Integer constant = 7132;

Integer not_constant = 2; Integer constant_ref = constant;

//constant = 2; Ошибка: нельзя изменить

14

System.out.println("Переменная: " + constant + ", Значение ссылки: " + constant_ref);

constant_ref = not_constant;

System.out.println("Переменная: " + constant + ", Значение ссылки: " + constant_ref);

// Нельзя создать "константный указатель" в том смысле, как это делается в C+

+.

final Integer constant_final = not_constant; //constant_final = 10; Ошибка: нельзя изменить

System.out.println("Переменная: " + not_constant + ", Значение ссылки: " + constant_final);

System.out.println("\nОсобенности работы с многоуровневыми указателями.");

//В Java нет многоуровневых указателей.

//Однако можно использовать массивы или коллекции для хранения ссылок. Integer multilevel = 123;

Integer[] arr = new Integer[1]; arr[0] = multilevel;

System.out.println("Результат: " + arr[0]);

}

}

15