Передать строку многомерного массива в качестве параметра - PullRequest
0 голосов
/ 05 февраля 2019

Моя программа на C имеет трехмерный массив, определенный как int origF [6][6][4].У меня также есть функция void displayPM (int tile []), которой я передаю origF [i][j] в качестве аргумента, что логически имеет смысл.Он работает должным образом (когда displayPM читает tile [k], он получает значение origF [i][j][k]. Однако компилятор (это был Turbo C ++ в VirtualBox) выдает предупреждение Преобразование подозрительного указателя с объяснением: Компилятор столкнулся с некоторым преобразованием указателя, из-за которого указатель указывал на другой тип. Вы должны использовать приведение для подавления этого предупреждения, если преобразование правильное.

Понимание этого, как единое целое- многомерный массив, многомерный массив - это просто указатель на начало данных, тогда какой тип origF [i][j]? Как он работает правильно, это все еще указатель, и он указывает на origF [i][j][0], но неправильный тип?Или это проблема с компилятором?

1 Ответ

0 голосов
/ 05 февраля 2019

Понимая, что многомерный массив, как и одномерный массив, является просто указателем на начало данных

Нет.Не в случае одного или многомерных массивов.Массивы - это блок данных.Это не указатель.Он преобразует в указатель на первый элемент, когда используется в большинстве других выражений (даже origF[i] на самом деле *(origF + i)), но это не сам указатель.

origF это массив.Когда вы индексируете его, он преобразуется в указатель на массив для этой цели.Это становится int (*)[6][4].Вы также можете создавать такие указатели.

int (*p)[6][4] = origF; // Here origF is decaying to a pointer to its first element.

И когда на него разыменовывается, вы получаете выражение типа массива, int[6][4].Это также происходит "рекурсивно" для любого количества измерений.

Итак, вернемся к вашему примеру, вы хотели знать, что такое origF [i][j].Это выражение имеет тип массива.Тип int[4].Когда вы передаете его функции, она автоматически преобразуется в int*.

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

В любом случае, поскольку TurboC больше не поддерживается, вам будет гораздо лучше с современным компилятором.GCC и Clang являются бесплатными и открытыми программами, соответственно, и имеют очень высокий QoI.Вы должны взглянуть на них.

...