2013-09-29 3 views
0

Я пытаюсь передать значение указателя в качестве параметра в двумерный массив, но он не работает? Вот пример:Два массива Dimesional в C

void Pass(char *ch) // <--------- Where's I'm getting the error 
{} 

int main(...) 
{ 
    char ch[5][5]; 
    Pass(ch); 
} 

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

+0

сообщите об ошибке. имя переменной само по себе должно указывать на первый элемент, поэтому 'ch == & ch [0] [0]' –

ответ

1

В C указатель на 2-мерный массив в основном такой же, как указатель на 1-мерный массив, а исходные размеры 2-мерного массива теряются при передаче в качестве указателя (char* в вашем случае).

Вы можете определить свою функцию Pass с явным определением размера:

void Pass(char ch[5][5]) {...} 

Или передать размеры в качестве дополнительных параметров:

void Pass(char* ch, int size_x, int size_y) {...} 

Второй вариант является более динамичным, но требует большей осторожности. Для доступа к массиву в точке (х, у), используйте эту формулу:

ch[size_y * x + y] 

При прохождении size_x может показаться излишним, вам нужно ограничить x от 0 к size_x-1 и y от 0 до size_y-1.

+0

Передача n-мерного массива всегда требует, чтобы вы явно указывали размер всех других измерений, превышающих 1. Второй подход не будет работать. –

+0

он, безусловно, будет работать и более динамичен - это не ограничивается размером фиксированного массива – mvp

+0

@ FilipeGonçalves Um, почему это не сработает? (кроме того, что он должен быть передан как '& arr [0] [0]' вместо 'arr') –

1

Правило разложения от матриц к указателю не является рекурсивным. Внутри main() ch имеет тип char (*) [5], то есть указатель на массив из 5 символов. Pass() ожидает указатель на char, следовательно, ошибка.

Следовательно, Pass() должен быть объявлен как принимающий char (* ch) [5].

Смежные вопросы