使用const数据指针的替代方法?

时间:2016-09-19 17:02:12

标签: c pointers const const-correctness

在我的C99程序中,我有一个带浮点指针的结构(表示矩阵)。结构体经历了一组例程,称为main

我想确保被调用的例程不改变结构的内容(矩阵中的实际值)。但是,数据应该可以从main更改。

我提出了以下解决方案,我在其中定义了指向const数据的指针:

struct math_object {
    const real_t *p_to_matrix;
};

这样做,所有被调用的例程都不能更改p_to_matrix指向的基础数据。

在程序的最开始,我分配了user_matrix指向的一些内存,我初始化了值,并使用这个(有点丑陋的)演员将p_to_matrix指向user_matrix:< / p>

real_t *user_matrix;
... allocate memory ...
... initialize the data ...
math_object1.p_to_matrix = (const real_t *) user_matrix;

然后我只允许用户更改user_matrix指向的值。

是否有一种更好/更清洁/更安全的传递数据的方式应该被调用的例程视为const,但是你需要一次又一次地更改相同的数据?

1 个答案:

答案 0 :(得分:1)

一种方法是不要让API的用户完全看到// This goes into the header file for your API struct math_object; // Forward declaration struct math_object* math_allocate(/* allocation parameters go here */); void math_free(struct math_object* obj); const real_t *math_get_matrix(struct math_object* obj); 的结构,而是提供与之交互的功能。通过这种方式,您可以将指针保持为非const,并完全避免使用:

real_t math_get_matrix_val(struct math_object* obj, size_t row, size_t col);
void math_set_matrix_val(struct math_object* obj, size_t row, size_t col, real_t val);

您可以阻止用户查看指向值的指针,但代价是包装器数量增加一倍:

struct math_object

现在您可以使用非const指针在您的实现中定义struct math_object { real_t *p_to_matrix; }; ,因为您的API的用户只看到标题,因此他们无权访问内部:

struct
  

我在ss = series_of_dates.astype(str).tail(1).reset_index().loc[0, 'date'] 中有20多个矩阵,因此参数列表会很长。

您有两种方法可以让API用户访问20多个矩阵:

  • 制作20多个API函数,每个矩阵一个 - 当矩阵表示不相关的内容时,此方法效果最佳,或者
  • 创建一个带矩阵的函数&#34; number&#34;或其他一些标识符 - 当矩阵表示类似的概念时,这种方法很有效,几乎是一组矩阵。