Учтите это:
int i[50]; void *a = i; //i.e. = &i[0] void *b = &i;
Будет ли a == b всегда верным или существуют платформы / компиляторы, где это не всегда может быть правдой?
a == b
да, пункт 6.5.9 стандарта (оператор равенства) гласит:
Два указателя сравнивают равные, если ... оба являются указателями на один и тот же объект (включая указатель на объект иподобъект в начале)
Да, значение, приведенное к void*, совпадает ... но исходный тип не совпадает.
void*
Имеет
int arr[100];
значение arr, когда онораспадается на указатель на свой первый элемент, имеет тип *int; , значение &arr имеет тип int (*)[100]
arr
*int
&arr
int (*)[100]
В этом конкретном случае, да, и a, и b будут одинаковыми, поскольку рассматриваемый массив равен 1D. К вашему сведению - это не так, если речь идет о двумерном или более крупномасштабном массиве? Читайте больше об указателе на массивы, в этом случае. Полезная для понимания концепция, хотя ее лучше избегать для поддержания хорошей читабельности кода.