Кастинг (двойной *) к (двойной **) разрешен?

Потому что я последовал за обсуждением, где мне сказали, что псевдоним через несовместимые типы указателей является неопределенным поведением (например, double d; int *p = (int *)&d; следующий вопрос:

Разрешено ли бросать (double *) в (double **)например, double *d1; double **d2 = &d2 а также используя синтаксис как d2[0][y] ожидая быть таким же, как d1[y]?

Я знаю, что это не совсем совпадает с несовместимыми типами указателей, но я не уверен. Фоном является то, что я хочу иметь функцию, которая работает с 2-мерными массивами (= изображения), но я хочу иметь возможность передавать только строку или столбец изображения.

1

Решение

double** несовместимо с double*, Преобразование является законным, но единственное, что вы можете сделать с результатами, это вернуть их. Это кажется более или менее очевидным: на 32-битной машине double* даже не будет иметь такой же размер, как double,

Но твой пример не преобразовать double* в double**, Это создает новый double**, который указывает на double*, Это отлично.

5

Другие решения

Можно ли разыграть ) удвоить *), например двойной * 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.

1

По вопросам рекламы [email protected]