#c
#c
Вопрос:
Рассмотрим это:
int i[50];
void *a = i; //i.e. = amp;i[0]
void *b = amp;i;
a == b
Всегда будет иметь значение true или существуют платформы / компиляторы, где это может быть не всегда верно?
Ответ №1:
да, в пункте 6.5.9 стандарта (оператор равенства) говорится:
Два указателя сравниваются равными, если … оба являются указателями на один и тот же объект (включая указатель на объект и подобъект в его начале)
Комментарии:
1. Звучит довольно убедительно. Просто для полноты картины, можно ли с уверенностью предположить, что элемент массива считается подобъектом массива? (Обычно я рассматривал эту концепцию только как применимую к членам структуры.)
2. @Oli: массивы определяются следующим образом
An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type
.
Ответ №2:
Да, значение, приведенное к void*
, такое же … но исходный тип не совпадает.
Имея
int arr[100];
значение arr
, когда оно преобразуется в указатель на его первый элемент, имеет тип *int
;
значение amp;arr
имеет тип int (*)[100]
Ответ №3:
В этом конкретном случае, да, как a, так и b будут сообщены одинаковыми, поскольку рассматриваемый массив равен 1D. К вашему СВЕДЕНИЮ — это было бы неверно, если бы речь шла о массиве 2D или более высокой размерности? В таком случае прочитайте больше о указателях на массивы. Полезно знать концепцию, хотя ее лучше избегать для поддержания хорошей читаемости кода.