Ссылка на одно измерение двумерного массива - PullRequest
1 голос
/ 24 ноября 2010

У меня есть некоторый код на C, который прекрасно работает, но я не понимаю одну часть кода. В этой части он передает метод с двумя указателями на двумерный массив с указанием только одного измерения.

Вот оно:

if (cmppt(pts[i*3], pts[hull*3])) 
      hull = i; 

метод cmppt выглядит так:

inline bool cmppt(const float* a, const float* b) { 
      if (a[0] < b[0]) return true;
      if (a[0] > b[0]) return false; 
      if (a[2] < b[2]) return true; 
      if (a[2] > b[2]) return false; 
      return false; 
} 

Массив pts является двумерным массивом. Мой вопрос: когда метод передается обоим массивам, например, pts [3] и pts [0], как мне узнать, на какую часть массива он смотрит? Кажется, что pts [0] просматривает первый элемент первого измерения массива, а pts [3] просматривает второй элемент первого измерения массива, но это не имеет смысла.

Спасибо

Ответы [ 2 ]

5 голосов
/ 24 ноября 2010

pts[i*3] эквивалентно &pts[i*3][0], который является указателем на первый элемент i*3 первой строки 2D-массива.Аналогично, pts[hull*3] - это указатель на первый элемент hull*3 первой строки массива.

Итак, функция cmppt берет указатели на две строки массива.Он не знает , на какие строки он смотрит, он знает только, что он смотрит на строки.

1 голос
/ 24 ноября 2010

это потому, что когда вы говорите pts [i * 3], вы действительно говорите pts [i * 3] [].2 размерных массива имеют строки и столбцы ... вы передали ему строку.

ваш массив (неровный) выглядит так:

    int[][] pts = 
    {
        new int[]{ 0, 1, 2, 3, 4, 5},
        new int[]{ 0, 1, 2, 3, 4, 5},
        new int[]{ 0, 1, 2, 3, 4, 5},
        new int[]{ 0, 1, 2, 3, 4, 5},
        new int[]{ 0, 1, 2, 3, 4, 5},
        new int[]{ 0, 1, 2, 3, 4, 5}
    };

затем вы передаете его в функцию, подобную этойв основном:

cmppt(int[] a, int[] b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...