В C совпадает ли адрес первого элемента в массиве с адресом массива?

#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 или более высокой размерности? В таком случае прочитайте больше о указателях на массивы. Полезно знать концепцию, хотя ее лучше избегать для поддержания хорошей читаемости кода.