отчет 1 семестр практика 4 11 вариант
.docxБалтийский государственный технический университет «ВОЕНМЕХ» им. Д. Ф. Устинова
Кафедра И5 «Информационные системы и программная инженерия»
Практическая работа №4 по дисциплине «Информатика: Основы программирования» на тему «Указатели»
Выполнил: Студент Ситева Софья Борисовна Группа О401Б Преподаватель: Лазарева Татьяна Ильинична
Санкт-Петербург 2020 г.
Условие задачи:
Набрать текст программы, проанализировать ее, в начало программы
добавить вывод на экран адресов всех переменных, а в конец – значений всех
переменных, выполнить программу, проанализировать полученные
результаты и попытаться объяснить, почему они именно такие. Обратите
внимание на операторы (double*) a;и (float) *a и объясните в чем отличие.
Текст программы:
#include <stdio.h>
#include <stdlib.h>
#define NULL ((void*)0)
int main()
{
int* a, b;
float* x, y = 3.5;
double* m, n;
printf("adress a =%p\n", &a);
printf("adress b =%p\n", &b);
printf("adress x =%p\n", &x);
printf("adress y =%p\n", &y);
printf("adress m =%p\n", &m);
printf("adress n =%p\n", &n);
a = &b; // получаем адрес переменной b
printf(" Enter b = ");
scanf_s("%d", a);
x = &y; // получаем адрес переменной y
printf("1 &a = %p\tb = %d\n", a, b);
b -= y; // т.к. y вещественное число, а b целое, то значение выражения округляется
printf("2 &a = %p\t *a = %d\tb = %d\n", a, *a, b); // *a выводит содержимое переменной b
m = (double*)a; // получаем адрес переменной b и меняем тип a
printf("3 &a = %p\t &m = %p\n", a, m);
m = &n; // получаем адрес переменной n
printf("4 &n = %p\t &m = %p\n", &n, m);
n = 5.5; // меняем значение переменной n
m += 2; // меняем значение переменной m, которая раньше содержала адрес переменной a
printf("5 n = %lf \t &n = %p\t &m = %p\n", n, &n, m); // m получает новый адрес
*m = (float)*a - n + (int)*x; // a и x разыменовываются и меняют тип т.е. используются значения тех адресов что хранились в этих переменных
printf("6 &m = %p\t *m = %lf\n", m, *m);
m -= 2;
printf("7 n = %lf\t &n = %p \t&m = %p \t *(m+2) = %lf\n", n, &n, m, *(m + 2));
// вставить значения всех переменных с пояснительным текстом при выводе
return 0;
}
Результат работы программы:
Вывод:
(double*) a отличается от (float) *a тем, что в первом случае «*» относится к названию типа, а во втором случае «*» - разыменование