В общем случае число *
представляет собой количество косвенностей для достижения переменной. Поэтому вам нужно создать d. Я предполагаю, что это не имеет практического применения - это ответ на рекреационную проблему.
Косвенное обозначение на C - это адрес, указатель. Создание объектов d означает создание адресов d для доступа к переменным данным (пространство, присвоенное переменной типа T).
p(d) -> p(d-1) -> ... -> p(1) -> variable
Чтобы создать динамически такую структуру, вы можете сделать это с помощью таНоса (заменить T с любым известным типом), и - так как вы не можете указать количество *
динамически к указателю - требует некоторого C взлом.
Итак, опять же, это не то, что рекомендуется и особенно плохой дизайн, особенно для неопытных разработчиков C. Цель состоит в том, чтобы показать, что это можно сделать динамически, независимо от значения d.
Скажет Т представляет собой двойного
int d = ...; // from input (d >= 1)
double variable;
double **S = malloc(sizeof(double *) * d); // array of pointers to pointer
S[d-1] = &variable; // last address points to target
int i;
for(i=d-2 ; i>=0 ; i--) S[i] = (double *)&S[i+1]; // previous address
// points to next location
Там нет никакого способа, чтобы представить произвольное число indirections в C, так что S
лишь **
для удовлетворения требований компилятора и отливает в случае необходимости.
Давайте попробуем с д набора для и применение алгоритма выше (скажем, T является двойным), имеющим
double variable is at address 0100 (decimal), value 3.14
S address given by malloc at 1000
a pointer size being 4
a double size being 8
variable
v
[8 bytes double value 3.14]
^
0100
S
v
[1004][1008][1012][0100]
^ ^
1000 1012
Теперь структура находится в месте, как использовать/проверить? Вы можете создать функцию, которая возвращает тип Т (двойной здесь), принимает значение S и D, срабатывать d indirections и возвращает переменную
double getvariable(double **S, int d) {
while (--d > 0) S = (double **)*S; // d-1 iterations
return *(double *)*S;
}
пытается его
printf("%lf\n", getvariable(S, d)); // 3.14
испытать выше структуры без функции, для г == 4, можно создать
double ****p = (double ****)*S;
printf("%lf\n", ****p); // 3.14
Никогда не используйте указатели более двух уровней косвенности, или я хотел бы предложить не даже не использовать указатели до тех пор, и если это необходимо. – haccks
Звучит так, как будто вам нужна d-мерная структура данных, возможно, один плоский массив с функциями поиска, а не d уровней указателей. Вы не можете сделать уровень косвенности (nmber of asterisks) динамическим. –
@haccks - * Никогда не используйте указатели более чем на два уровня косвенности ... * Как бы вы создали трехмерный массив переменного размера? –