Потому что я последовал за обсуждением, где мне сказали, что псевдоним через несовместимые типы указателей является неопределенным поведением (например, double d; int *p = (int *)&d;
следующий вопрос:
Разрешено ли бросать (double *)
в (double **)
например, double *d1; double **d2 = &d2
а также используя синтаксис как d2[0][y]
ожидая быть таким же, как d1[y]
?
Я знаю, что это не совсем совпадает с несовместимыми типами указателей, но я не уверен. Фоном является то, что я хочу иметь функцию, которая работает с 2-мерными массивами (= изображения), но я хочу иметь возможность передавать только строку или столбец изображения.
double**
несовместимо с double*
, Преобразование является законным, но единственное, что вы можете сделать с результатами, это вернуть их. Это кажется более или менее очевидным: на 32-битной машине double*
даже не будет иметь такой же размер, как double
,
Но твой пример не преобразовать double*
в double**
, Это создает новый double**
, который указывает на double*
, Это отлично.
Можно ли разыграть ) удвоить *), например двойной * d1; двойной ** d2 = &d2 и используя синтаксис, такой как d2 [0] [y], ожидая того же, что и d1 [y]?
Конечно нет, и это даже не скомпилирует.
Но если вы имели в виду:
double *d1;
double **d2 = &d2;
тогда да, вышеупомянутое совершенно верно и так как d2[0][y]
можно рассматривать как (*d2)[y]
Там действительно нет никаких проблем.
Наконец, помните, что в приведенном выше коде вы ничего не разыгрываете: &d2
уже типа double**
, Если вам нужно что-то разыграть, используйте приведение в стиле C ++ (static_cast
, dynamic_cast
, reinterpret_cast
и т. д.), а не в стиле C.