Другие языки программирования и технологии

Почему в ответе получается 2, а не 8...?

#include
using namespace std;
int main()
{
int mas[3];
printf("%d - %d = ", &mas[3], &mas[1]);
cout << &mas[3] - &mas[1] << endl;
}
а где инициализация?
Андрей Борисов
Андрей Борисов
83 981
Лучший ответ
Сергей Миронов а на хрена она нужна?... мне нужен тока адрес
если из трех вычесть единицу, то в моей математике тоже восемь ну никак не получается
Юра Никотин
Юра Никотин
25 516
Потому что у тебя смещение считается не в байтах, а в размерах типа массива, в данном случае инта
Stalker S
Stalker S
8 860
Твою логику поймет только тот, кто писал на ASM, где у тебя нету указателей, числел и дробных, а были только 4 байта, которые ты использовал как хотел. Ещё со времён языка С арифметика указателей была таковой, что расстояние между двумя указателями (ofc на объекты одного типа (или хотя бы размера)) = (адрес1 - адрес2) / размер объекта, на который указатель указывает, в данном случае - int, 4 байта.

Допустим, адрес массива начинается с 800(в десятичной). Тогда &mass[1] == 804 и, соответственно, &mass[3] == 812, значит расстояние = (812 - 804) / sizeof(int) = 8 / 4 = 2

Сделано это все для того, чтобы можно было получить конкретно расстояние между ячейками массива именно в ячейках, а не в байтах

UPD: точно также, mass + 1 это не адрес массива +1 байт, это первая ячейка массива (помним, что нумеруются они с нуля), тогда &mass[i] всегда == mass + i, отсюда математически следует, что:

&mass[3] - &mass[1] == (mass + 3) - (mass + 1) == mass + 3 - mass - 1 == 3 - 1 == 2, где мы помним, что в таких выражениях имя массива преобразуется в его адрес, а адрес массива - это адрес его первого элемента. Надеюсь, доступно объяснил. Если что отвечай в комментариях, чего непонятно, помогу

UPD2: Вообще, по всем вопросам по плюсам обращайся на специализированные форумы, типа stack owerflow или cuberforum, там тебе гарантировано помогут, а сейчас, считай, повезло.
Dmitri Chebotarev
Dmitri Chebotarev
466