Рассмотрим следующий небольшой пример кода:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *i;
char *c1, *c2;
i = malloc(4);
*i = 65535;
c1 = i;
c2 = (char *)i;
printf("%p %p %p\n", i, c1, c2);
printf("%d %d", *c1, *c2);
free(i);
return 0;
}
В этом примере я выделяю память для хранения целого числа, на которое указывает i. Затем я сохраняю значение 65535 (1111 1111 1111 1111) в *i. Следующее, что я делаю, это сделать два указателя char *, также указывая на целое число. Я делаю это два раза, но двумя разными способами: c1 = i; и c2 = (char *)i;. Наконец, я печатаю все указатели и все значения на экране. Три указателя указывают на один и тот же адрес, и два значения *c1 и *c2 являются правильными (- 1).
Однако компилятор генерирует предупреждение в этой строке: c1 = i;. Предупреждение генерируется, потому что я не использовал приведение (char *) для выполнения задания.
То, что я хотел бы задать, - почему, компилятор генерирует это предупреждение, так как я не вижу любую разницу при использовании c1 = i; или c2 = (char *)i;. В обоих случаях результатом является тот же адрес с одинаковым размером в байтах. И это справедливо для всех бросков, даже если это (int *) cast, (float *) cast, (short *) cast и т.д. Все они генерируют одно и то же значение, но компилятор принимает его только без предупреждения, если Используемый тип используется для типа указателя.
Мне действительно хотелось бы знать, почему компилятор запрашивает этот приведение, даже если результат всегда один и тот же.