Значение декларации float ***c - PullRequest
3 голосов
/ 06 января 2020

Я передаю пример уравнения сфероидальных гармоник c из C в C ++ из следующего документа . При этом я сталкиваюсь с проблемой декларации, которую я никогда не видел float ***c. Пример можно увидеть в том же источнике на стр. 777. В частности, функция приведена ниже:

void solvde(…, float **y, float ***c, float **s); 

Я видел несколько старых сообщений , объясняющих некоторые необычные объявления. Также этот пост был как-то полезен, но это не дало мне полного понимания того, что я ищу. Я много исследовал, но не нашел хорошего объяснения. Кроме того, в том же источнике нет объяснения этому.

Может ли кто-нибудь объяснить или привести небольшой простой пример такого рода декларации и того, как ее использовать, и, что наиболее важно, что будет ее эквивалентом в C ++ ?. Спасибо за указание в правильном направлении.

Ответы [ 3 ]

3 голосов
/ 06 января 2020

float - это имя типа с плавающей запятой. Числа с плавающей точкой используются для представления подмножества рациональных чисел с конечной точностью.

Учитывая имя типа T, T* - это имя типа, которое является типом указателя. В частности, это указатель на тип T. Указатель используется для косвенного «обращения» (указания) к другому объекту. Значение указателя является адресом памяти, где хранится указанный объект. Можно получить значение указанного объекта путем косвенного обращения через указатель.

Указатели часто используются в качестве итератора для обхода элементов массива. Это становится возможным благодаря «арифметике указателей c»: добавляя 1 к указателю, изменяет его так, чтобы он указывал на последующий элемент массива.

Таким образом, float* является указателем на float , Кроме того, float** является указателем на float*, то есть указателем на указатель на float. Наконец, float*** - это указатель на float**, то есть указатель на указатель на указатель на float.

, что будет его эквивалентом в C ++?

В C ++ существуют указатели, а также указатели на указатели и указатели на указатели на указатели.

Я видел несколько старых постов, объясняющих некоторые необычные объявления.

В C достаточно редко указывать «трехзвездочный» указатель, а в C ++ - очень редко, но в этом нет ничего особенного.

0 голосов
/ 06 января 2020
void solvde(…, float **y, float ***c, float **s); 

как

type * a;

означает, что a является указателем на type, подставив a на *a, означает, что указатель на указатель на тип и т. д., эквивалент объявления
в виде массива с заданным размером измерения равен

float y[][5] = { {4,5,7.0}, {0.9, 7}, {5.8} }; 
float c[9][5][7] ={};
float s[2][7] ={};

1-й будет массивом 3 x 5 dim. размер плавающего номера типа, а также 9 х 5 х 7 и 2 х 7 тусклых. Размер для остальных
Разница здесь это постоянный указатель, поэтому 1-й равен float** const y с общим размером 3 x 5 x float выделяется статически ie. во время компиляции

0 голосов
/ 06 января 2020

Другие ответы хорошо отвечают на ваш вопрос, и они верны в том, что это также допустимый C ++. Однако я склонен сказать, что «больше C ++ 11» эквивалента тройной звезды будет:

std::vector<std::vector<std::vector<float>>>

До C ++ 11 это было бы немного страшнее:

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