考虑将struct
作为成员的动态分配数组,例如:
struct matrix {
unsigned cols;
unsigned rows;
double* data;
};
如何编写像print_matrix(const matrix);
这样的函数来保证数据data
不会被修改?
我可以定义类似
的内容struct const_matrix {
const unsigned cols;
const unsigned rows;
const double* data;
};
然后将struct matrix
隐式转换为struct const_matrix
?
Here是一个小例子,为什么第一个版本不起作用。
答案 0 :(得分:1)
是的,你的直觉是正确的。您可以像您一样定义struct const_matrix
,然后转换为它:
void print_matrix(struct const_matrix *m)
{
// This bad implementation tries to change data.
// It does not compile.
m->data[0] = 100;
}
要调用它,从(struct matrix *)转换为(struct const_matrix *)。例如:
{
struct matrix m;
m.cols = 4;
m.rows = 4;
m.data = calloc(sizeof(double), m.cols*m.rows);
...
print_matrix((struct const_matrix *)&m);
}
请注意,您必须强制转换指针类型(即从(struct matrix *)
转换为(struct const_matrix *)
,因为C不允许您将一个结构转换为另一个结构(即从(struct matrix)
转换为<{1}}是不允许的。)
答案 1 :(得分:0)
你可以在那里有另一个const
:
double * const data; // non constant pointer to constant data
甚至
double const * const data; // constant pointer to constant data