двойной указатель в цикле - PullRequest
3 голосов
/ 27 мая 2011

В следующем примере (из исходного кода mysql) используется поле Field **.У меня проблемы с тем, чтобы представить его в виде двухмерного массива поля.

typedef struct st_table_share  
{  
  .......  
  Field **field;           
  ....  
}  

for (Field **field=table->field ; *field ; field++)  
{  
    ...  

Можно ли так думать, таблица содержит много строк, а строка содержит несколько столбцов / полей.Итак, * поле означает строку, а ** поле означает таблицу?

Если это так, для следующего кода

for (Field **field=table->field ; *field ; field++)

он завершится, когда * field равно null, так как же * field может быть null, если * field - строка.Или я могу сказать, что если в строке 5 столбцов, а поле - это первый столбец, то поле + 4 - это поле последнего столбца, а поле + 5 - это конец столбца, что означает ноль, так что цикл for завершится?

Ответы [ 4 ]

4 голосов
/ 27 мая 2011

То есть *field означает строку, а **field означает таблицу?

В синтаксисе объявления да.

как *field может быть нулевым, если *field является строкой

Если авторы кода позаботятся о сохранении инварианта о том, что field завершается нулевым указателем, как это делается с argv. То есть, таблица из n строк является массивом n + 1 указателей, последний из которых всегда должен быть нулевым. Это общее соглашение C, которое устраняет необходимость явного подсчета.

1 голос
/ 27 мая 2011

Вы уверены, что Field ** - это двумерный массив?

Переменная типа Field ** не обязательно представляет собой двумерный массив полей.Это может быть указатель на одномерный массив указателей на поля.Хранить массив указателей может быть удобнее, чем хранить массив структур по нескольким причинам: вы можете выделить память для структур независимо, вам не нужно использовать memcpyдобавьте структуру в список, и некоторые операции со списком будут дешевле.Фактически это делается в libusb , где переменная типа libusb_device ** представляет (одномерный) список USB-устройств.

0 голосов
/ 27 мая 2011

Или я могу сказать, что если в строке 5 столбцов, а поле - это первый столбец, то поле + 4 - это поле последнего столбца

Да, но вы можете сказать, что

и поле + 5 является концом столбца, что означает нуль

только в том случае, если вы инициализировали массив как терминируемый нулем.

Иесли вы знаете, сколько столбцов имеет ваша таблица, вы можете выполнять итерацию до последнего столбца вместо ; *field ;.

0 голосов
/ 27 мая 2011

Цикл будет продолжаться до тех пор, пока "* field" не станет нулевым.то есть массив должен иметь нулевой терминатор (несуществующую строку) в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...