но когда я использую этот код, я получаю предупреждение, что неявное преобразование теряет целочисленную точность: от 'long' до 'int'.
Это означает, что на вашей платформе , разница двух указателей имеет тип long
.
Я пытался использовать long, потому что я кое-что вспомнил об указателях и long. Но у указателей нет типа данных (если я ошибаюсь, поправьте меня).
Вы ошибаетесь, у всех есть тип в C. У указателей есть типы указателей . Разница между двумя указателями заключается в целочисленном типе со знаком, но в стандарте не указывается, какие из них используются разными платформами.
Но в стандарте указывается typedef
по имени ptrdiff_t
(определено в stddef.h
), которое должно быть определено для целочисленного типа со знаком разницы в указателях, так что это тип, который вы должны используйте для того типа кода, который вы показываете.
Обе точки и * pos инициализируются с помощью int. Так почему long fit, а int нет?
Указатели типов, на которые указывают указатели, отличаются от самих указателей. Указатели - это адреса, и в вашей системе адреса могут быть больше, чем int
значений.
Почему они используют int в решении? Это неправильное решение
Да, это неправильно. Как объяснялось выше, выражение pos - points
- это некоторый целочисленный тип со знаком, и это может быть int
на некоторых платформах, но вы не можете предположить, что.
Конечно, было бы хорошо и следующее:
int points[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *pos = points + 5;
int index = (int)(pos - points);
В этом примере вы знаете, что результат может быть представлен в int
, поэтому вы можете просто преобразовать его явным приведением. Но не делайте этого в общем .