2007-03-24

*** и *****

Большинство С программистов использовало иногда в своем коде указатель на указатель, что дает в записи две звездочки: int **p; При этом мы бормотали "...две звездочки, три звездочки, но лучше, конечно, пять звездочек!". Но мало кто мог придумать разумное использование для таких конструкций. Ну так слушайте, дети мои, рассказ о том, где и как я использовал три и больше звездочек. Представьте, что вам надо сделать матрицу из двух измерений. В языке С нет многомерных массивов. Поэтому матрицу можно либо зарезервировать в виде одного одномерного массива и всё время пересчитывать индексы, либо сделать массив массивов, или в случае, когда размерность не известна, массив указателей: int **p=(int**)malloc(N*sizeof(int*)); for(int i=0;i При этом в программе обращение к элементу будет иметь вид p[i][j], что наглядно, и вполне компилируемо даже при том, что размерность в момент компиляции не известна. Это довольно типичный прием, но фишка в том, что возвращаемое значение будет иметь уже желаемые три звездочки: void create_matrix(int ***pp){   int **p=...;   *pp=p;   } Легко видеть, что там можно создавать и матрицы более высоких порядков, причем число звездочек равно числу измерений матрицы, что, кстати, очень наглядно. А возвращаемое значение через параметр всегда на одну звездочку больше. Поэтому желаемые пять звездочек можно получить при работе с четырех-мерными или пяти-мерными матрицами. Такие матрицы вполне типичны в задачах логического перебора, где число измерений может быть довольно высоким. Дарю идею, друзья-программисты. Представляете, читает кто-нибудь код и видит: int *****p; // Do not drink less then 5 stars!

No comments: