2013-12-10 4 views
1

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

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

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

+1

Вы не делаете кастинг. Фактически, ** double ** d2 = & d1 ** действительно. – David

+0

В первом пара, вы имеете в виду 'double d; int * p = (int *) & d; '..? –

+0

@ user1158692: Да, я исправил его. – mb84

ответ

5

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

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

1

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

Конечно, нет, и это won't even compile.

Но если вы имели в виду:

double *d1; 
double **d2 = &d2; 

тогда да, выше вполне допустимо и так d2[0][y] можно рассматривать как (*d2)[y], там действительно нет проблем.

И, наконец, помните, что в приведенном выше коде вы ничего не делаете: &d2 уже относится к типу double**. Если вам нужно что-то бросить, используйте приведения стиля C++ (static_cast, dynamic_cast, reinterpret_cast и т. Д.), А не приведения стиля C.