ЯП Лабораторная работа 4
.pdfПриложение А
Код программы на языке 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
