0
int arr[4] = {4,5,6,3};
float * b =(float*)arr;
int * b1 = (int*)arr;
cout << b + 1<<" "<< b1+1<<" "<<b1[1]-b[1]<<endl;

Я не понимаю,почему мы присваиваем указателю типа float указатель на int-массив и когда мы прибавляем ему единицу он прибавляется на sizeof(int) а не sizeof(float),ведь тип указателя float а не int.Я думал адресная арифметика считается относительно базового типа указателя.

И почему b1[1]-b[1] возвращает 5 а не 0?

  • "прибавляется на sizeof(int) а не sizeof(float)" А что, у вас sizeof(int) != sizeof(float)? "почему b1[1]-b[1] возвращает 5 а не 0" Может вы хотели написать &b1[1]-&b[1]? Но еще нужно будет касты добавить. – HolyBlackCat Apr 08 '20 at 23:35
  • HolyBlackCat,нет,именно b1[1]-b[1], b1[1] равно же 4 ровно как и b[1] – Barracudach Apr 08 '20 at 23:40
  • 2
    5.f вряд ли хранится в памяти в том же виде, что и 5 (вот тут можно почитать про представление чисел с плавающей точкой). Плюс, b1[1] вообще нарушает strict aliasing и вызывает неопределенное поведение. – HolyBlackCat Apr 08 '20 at 23:47
  • 2
    @HolyBlackCat Нарушает b1[1] или b[1]? – Harry Apr 09 '20 at 03:45
  • @Harry Ой, b конечно... – HolyBlackCat Apr 09 '20 at 09:53

0 Answers0