#c #constants
#c #константы
Вопрос:
Я хочу заполнить динамически созданный массив только один раз в верхней части моей функции. Тогда каждая функция после может получить доступ только к содержимому, но не изменять его. Каков правильный способ:
const double *pt = malloc(sizeof(double)*num);
или
double *pt = malloc(sizeof(double)*num);
void f(const double array[], ...);
Когда я использую второй метод, должен ли я приводить pt к const ?
Ответ №1:
Первый метод не будет работать, потому что вы не сможете заполнить массив в первую очередь (поскольку вы его объявили const
).
Второй метод будет работать, если вы уже заполнили массив перед вызовом f()
.
Комментарии:
1. И вам не нужно приведение, чтобы добавить ‘const’.
2. @DavidSchwartz: Вы имеете в виду, что когда я вызываю функцию f, я могу просто передать ей pt, не приводя ее сначала к (const double *) ?
3. Правильно. Добавление ‘const’ является тривиальным преобразованием. (Удаление его, конечно, нет!)
Ответ №2:
Возможные решения:
- Создайте функцию ‘get’, которая принимает индекс и возвращает значение в массиве, например:
double get(int index){ return pt[index]; }
Сделать
get
общедоступным, но нетpt
. - Заполнить
pt
, но сохранить его закрытым и вместо этого сделать доступным указатель ‘const’, подобный этому://kept private: double * pt = malloc(...); pt[0] = 1; pt[1] = 2; .... //make public double const * public_pt = (double const *)pt;
Комментарии:
1. Есть ли способ сделать вещи частными или общедоступными в C? НЕ C ?
2. @Rich: Да — вы можете сделать это, используя заголовочные / исходные файлы. Поместите определения для всех функций / переменных в ваш исходный файл (.c), но в заголовочном файле (который включают другие пользователи) объявляйте только те функции, к которым вы хотите, чтобы другие люди могли получить доступ.