В других ответах описывалось, как стандарт C обрабатывает преобразование массива в указатель и как это влияет на объявление функции, но я чувствую, что они не учитывают , почему , так что я иду ...
В Си массивы обозначают плотно упакованные элементы в памяти.
A -> _ _ _ _ _ _ ...
i: 0 1 2 3 4 5 ...
В приведенном выше примере каждый из элементов массива имеет ширину 1 _
.Таким образом, чтобы найти i-й элемент, мы должны перейти по i-му адресу.(Обратите внимание, что крайнее левое измерение (размер) здесь не имеет значения)
Теперь рассмотрим многомерный массив:
B -> [_ _ _][_ _ _][_ _ _][_ _ _]...
i: 0 0 0 1 1 1 2 2 2 3 3 3
j: 0 1 2 0 1 2 0 1 2 0 1 2
^first row ^third row
Чтобы найти смещение A[i][j]
, нам нужно перепрыгнутьi строк (3 * i), а затем над j элементами -> (3 * i + j).Обратите внимание, что размер первого измерения здесь также не нужен.
Теперь уже должно быть ясно, что крайний левый размер не нужен при использовании массива, он нужен только тогда, когда высоздайте его .
Так как не требуется для определения размера крайнего левого индекса, тогда почему бы не дать его в любом случае для полноты картины?В конце концов, это то, что делается на языке программирования Pascal (современный C).
Ну, большинство функций, которые работают с массивами, работают одинаково для всех возможных длин массивов, поэтому указание размера только повредит вашемувозможность их повторного использования.
например, почему
int sum(int arr[10]){
int s = 0, i;
for(i=0; i<10; i++){
s += arr[i];
}
return s;
}
Когда вы можете сделать это вместо этого:
int sum(int arr[], int n){
int s = 0, i;
for(i=0; i<n; i++){
s += arr[i];
}
return s;
}
Что касается пропуска более одногоизмерение, это невозможно при использовании обычных многомерных массивов (потому что вам нужно знать измерение, чтобы знать, когда заканчивается первая строка, а начинается вторая).Однако, если вы готовы потратить немного (немного) дополнительной памяти на пустое место, вполне можно использовать указатели вместо указателей: http://www.eskimo.com/~scs/cclass/int/sx9b.html