Получите разницу двух адресов массива (используйте оператор &) - PullRequest
0 голосов
/ 01 июня 2019

Я хочу получить разницу адресов между двумя элементами в массиве.

int vector[] = { 28, 41, 7 };

printf("%d\n", &vector[2]); // 1703652
printf("%d\n", &vector[1]); // 1703648
printf("%d\n", &vector);    // 1703644

printf("%d\n", &vector[1] - &vector); // 1

Ожидаемый результат (Последняя строка): 4, поскольку тип данных был int.

.

Далее, каждый результат адреса имеет 4 различий.

Но почему результат

&vector[1] - &vector

1 а не 4?

А как мне получить 4 с помощью оператора вычитания?

Ответы [ 2 ]

3 голосов
/ 01 июня 2019

Вы можете вычислить разницу между указателями и значениями в байтах, приведя указатели к char *:

printf("%d\n", (char*)&vector[1] - (char*)vector);
3 голосов
/ 01 июня 2019

арифметика указателей на языке Си работает над типом объекта. Неважно, насколько велик объект. Ссылка на следующий объект минус ссылка на предыдущий всегда один объект

Так что, если мы добавим 5 к указателю, он укажет 5 объектов вперед. Если мы увеличиваем указатель, он будет ссылаться на следующий объект. Это помогает индексировать и перебирать объекты.

Когда вы печатаете адрес (ваш формат неправильный - вместо него следует использовать% p), он печатается в байтах. Таким образом, разница между последовательными объектами будет равна размеру объекта (плюс необязательный отступ).

А как мне получить 4 с помощью оператора вычитания ???

Приведите указатели к типу, размер которого равен единице, например char.

(char *)&vector[1] - (char *)&vector
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...