Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2013, 16:12   #1
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию Адресная арифметика в Си.Адреса переменных.

В ходе работы программы изменяется значение у, это происходит в выделенной мной строчке с указателем m.Почему на скриншоте снизу адрес m меняется когда в программе прибавляется 2 и вычитается 2, почему адреса изменились именно так?

Предположим, есть переменные с адресами
Код:
#include<stdio.h>
#include<conio.h>
int main(void)
{
int *a, b;
float *x, y = 3.5;
double *m, n;
printf("%p\n%p\n%p\n%p\n%p\n%p\n",&a,&b,&x,&y,&m,&n);
a = &b;
printf("  Enter b = ");
scanf("%d", a);
x = &y;
printf("  a = %p\tb = %d\n", a, b);
getch();
b -=(int) y;
printf("  a = %p\t*a = %d\tb = %d\n", a, *a, b);
getch();
m = (double*)a;
printf("  a = %p\tm = %p\n", a, m);
getch();
m = &n;
printf("  n = %p\tm = %p\n", &n, m);
getch();
n = 5.5;
m+=2;
printf("  n = %lf\tn = %p\tm = %p\n", n, &n, m);
getch();
*m = (float) *a - n + (int) *x;
printf("  m = %p\t*m = %lf\n", m, *m);
getch();
m -= 2;
printf("  n = %lf n = %p m = %p *(m+2) = %lf\n", n, &n, m, *(m+2));
printf("%p\n%d\n%p\n%lf\n%p\n%lf\n\n\n\n", a,b,x,y,m,n);
getch();
return 0;
}
East Undia Trading вне форума Ответить с цитированием
Старый 26.12.2013, 16:21   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
m = (double*)a;
в этой строчке ниче не смущает или так и задуманно?
Вообще не пойму цели сей программы... Что она показывает? Что так писать нельзя?
I'm learning to live...

Последний раз редактировалось Stilet; 26.12.2013 в 16:26.
Stilet вне форума Ответить с цитированием
Старый 26.12.2013, 17:33   #3
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Stilet, эта лабораторная работа.Написана не мной, мне нужно ее защитить.На основные вопросы я ответил, но потом спросили, почему меняется адрес m, я ответил неправильно.Потому мне дали задание по адресам.
East Undia Trading вне форума Ответить с цитированием
Старый 26.12.2013, 18:05   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

m - указатель на double. Далее действует адресная арифметика. Указатель смещается на размер типа, на который указывает, поэтому при увеличении/уменьшении на 2 указатель смещается на 16 байт.
"почему меняется адрес m" - потому что его меняют
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 26.12.2013 в 18:28.
BDA на форуме Ответить с цитированием
Старый 26.12.2013, 18:20   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
"почему меняется адрес m" - потому что его меняют
Там другая проблема: адрес смещается, но после -=2 на прежний не возвращается - вот что автор спрашивает. А я никак не могу понять после какого кегельбоулинга со стриптизом преподавателю, составлявшему сию методичку могло прийти в голову такое извращение...
Цитата:
увеличении/уменьшении на 2 указатель смещается на 16 бит.
Double это кажется 8 байт...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.12.2013, 18:28   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Там другая проблема: адрес смещается, но после -=2 на прежний не возвращается - вот что автор спрашивает.
В такой куче выводов не заметил и, честно говоря, до сих пор не вижу, о какой ошибке идет речь.
Цитата:
Сообщение от Stilet Посмотреть сообщение
Double это кажется 8 байт...
Да, описался. Исправил биты на байты
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 26.12.2013 в 18:32.
BDA на форуме Ответить с цитированием
Старый 26.12.2013, 19:08   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
о какой ошибке идет речь.
Как я понял:
Код:
Тут мы смещаем указатель на два вещественных
m+=2;
printf("  n = %lf\tn = %p\tm = %p\n", n, &n, m);
getch();

Тут мы страдаем маразмом
*m = (float) *a - n + (int) *x;
printf("  m = %p\t*m = %lf\n", m, *m);
getch();

А тут хотим вернуть на два вещественных назад, но обламываемся.
m -= 2;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.12.2013, 20:26   #8
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Кто угадает где в программе меняется у?На этот вопрос я ответил.
А теперь серьезно.Допустим есть переменные с адресами a=FE54;и x=FE44;.Какие адреса будут у переменных когда a+=3; и x-=2;?

Последний раз редактировалось East Undia Trading; 26.12.2013 в 20:28.
East Undia Trading вне форума Ответить с цитированием
Старый 26.12.2013, 20:42   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Кто угадает где в программе меняется у?
Что неужели отладчик за неуплату отключили?
Цитата:
Допустим есть переменные с адресами a=FE54;и x=FE44;.Какие адреса будут у переменных когда a+=3; и x-=2;?
Смотря какие типы переменных.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.12.2013, 20:45   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Если int *a и float *x, то a станет FE60, а x станет FE3C (если sizeof(int) = 4, sizeof(float) = 4).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Известны фамилии,адреса и телефоны 25-ти человек,Найти фамилии и адреса людей,чей телефон начинается с цифры 3. Расмотреть два слу salomon93 Паскаль, Turbo Pascal, PascalABC.NET 11 01.12.2011 23:36
адресная арифметика sterh11001100 Microsoft Office Excel 1 08.12.2010 13:20
Адреса переменных rommster Visual C++ 1 26.11.2010 08:35
Адресная арифметика и матрица. GrindeX Общие вопросы C/C++ 8 08.03.2010 15:03
Адресная книга Snake_ua PHP 6 26.02.2008 09:40