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!
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment