我的main函数生成一个矩阵作为值“m”的数组,以及另一个指向行“M”开头的指针数组。我想将此矩阵传递给子例程,以便不能修改任何值,并且不能修改行指针。即,子程序不得改变矩阵。因此,我将指针传递给指向常量值的常量指针。这很好用。预期的错误消息由以下示例生成。
#include<stdio.h>
#include<stdlib.h>
void fun(double const * V, double const * const * M)
{
V = V; // allowed but pointless
V[0] = V[0]; // not allowed
M = M; // allowed but pointless
M[0] = M[0]; // not allowed
M[0][0] = M[0][0]; // not allowed
}
int main()
{
double *V = (double *)malloc(2*sizeof(double));
double *m = (double *)malloc(4*sizeof(double));
double **M = (double **)malloc(2*sizeof(double *));
M[0] = &m[0];
M[1] = &m[2];
fun(V,M);
return 0;
}
错误讯息:
test.c: In function ‘fun’:
test.c:7:2: error: assignment of read-only location ‘*V’
test.c:9:2: error: assignment of read-only location ‘*M’
test.c:10:2: error: assignment of read-only location ‘**M’
这些是预期的。到目前为止一切都很好。
问题是传递非常量矩阵也会产生以下警告。我正在使用gcc v4.5而没有选项。
test.c: In function ‘main’:
test.c:22:2: warning: passing argument 2 of ‘fun’ from incompatible pointer type
test.c:4:6: note: expected ‘const double * const*’ but argument is of type ‘double **’
请注意,传递矢量“V”不会产生此类警告。
我的问题是:我可以将一个完全可变的矩阵传递给子程序,使其无法修改,不进行转换,也没有编译器警告吗?
答案 0 :(得分:0)
这会有所帮助:
void fun(double const * const V, double const * const * const M)
....
您面临的问题是double const *
不是指向double的const指针,它是指向const double
的指针。 double const *
== const double *
。
但是仍有一条评论:通常不使用序数类型const
说明符。
void fun(double const * V, double const * const * M)
.... // this allows to change V or M, but relaxes caller side
编辑:指针完全const
...所以他们指向的数据无法修改。