откуда C знает размеры 2d динамического массива в функции? - PullRequest
1 голос
/ 15 октября 2010

Я видел этот пример, когда пытался выяснить, как передавать указатели на динамически размещенные 2d-массивы для функций:

void zeroit(int **array, int nrows, int ncolumns)
 {
 int i, j;
 for(i = 0; i < nrows; i++)
  {
  for(j = 0; j < ncolumns; j++)
   array[i][j] = 0;
  }
 }

Я попробовал, и это работает, но я не понимаю как. Как функция "zeroit" вычисляет правильный адрес?

Ответы [ 4 ]

1 голос
/ 15 октября 2010
0 голосов
/ 15 октября 2010

, если учесть расположение / адреса памяти ниже:

array     =  |10|11|12|

array[0]  =  |20|21|22|

array[1]  =  |30|31|32|

ячейка 10 содержит указатель на ячейку 20, а ячейка 11 содержит указатель на 30, это называется двойной косвенностью - array isпоследовательная последовательность указателей на массивы целых слов по ширине слова, вычислять не нужно, просто разыменовываем два указателя

0 голосов
/ 15 октября 2010

Если ваш «2d массив» на самом деле является просто массивом указателей на отдельные строки, то он вычисляет правильный адрес, просто просматривая адрес строки и применяя к ней смещение.Тем не менее, это очень неэффективный способ реализовать «2d массив».Лучший способ - просто использовать обычные одномерные массивы и самостоятельно вычислять индекс с помощью умножения и сложения, но в C99 вы также можете использовать семантику vla, чтобы компилятор рассматривал его как настоящий двумерный массив.

0 голосов
/ 15 октября 2010

Расчет не требуется.Ваша функция "zeroit" достигает целого числа посредством "двойной косвенности".

"int ** array" на самом деле не является матрицей целых чисел.Это в точности «указатель на указатель на целое число» - больше векторов, целых векторов.При доступе к «array [i]» (первое косвенное обращение) вы получаете «int *», то есть адрес i-го вектора целых чисел.При доступе к «array [i] [j]» (вторая косвенность) вы получаете «int», то есть j-е целое число i-го вектора.

...