我在C语言中遇到了这种奇怪的行为。
这段代码给了我编译警告:
expected 'double **' but argument is of type 'double (*)[2]'
问题是什么?双精度数组是双精度指针,对吗?
顺便说一句,如果我发送数组本身,分配不会影响值,我也不知道为什么。
#include <stdio.h>
void set1(double **x)
{
(*x)[0] = (*x)[1] =1.0;
}
int main()
{
double x[2];
set1(&x);
printf("%d\n%d\n",x[0],x[1]);
}
对于符合C标准的启动器,应声明无参数的main函数,例如
int main( void )
要输出类型的对象,double
您至少应使用转换说明符%f
而不是%d
。否则,该函数printf
具有未定义的行为。
现在关于指针。
如果您有一个类型为object的对象,则T
其中T
有一些类型说明符序列,例如
T x;
那么指向对象的指针将具有类型 T *
因此,让我们使用此抽象类型编写程序T
。
#include <stdio.h>
void set1( T *x )
{
//...
}
int main(void)
{
T x;
set1( &x ) ;
// ...
return 0;
}
该程序将无法编译,因为T
到目前为止类型仍然未知。但是T
原始程序的类型是什么?
可以通过以下方式定义
typedef double T[2];
现在,如果将此typedef添加到程序中,它将进行编译。
#include <stdio.h>
typedef double T[2];
void set1( T *x )
{
//...
}
int main(void)
{
T x;
set1( &x ) ;
// ...
return 0;
}
那么,如果使用表达式&x
作为参数,则函数参数的类型是什么?
其类型为double ( *x )[2]
。这double **
与这两种类型的指针不同,并且没有隐式转换。也就是说这些类型的指针不兼容。
在这种情况下,返回到原始程序
#include <stdio.h>
void set1( double ( *x )[2] )
{
(*x)[0] = (*x)[1] = 1.0;
}
int main(void)
{
double x[2];
set1( &x ) ;
printf( "%f\n%f\n", x[0] , x[1] );
return 0;
}
如果您希望功能参数确实具有类型,double **
则必须指定功能参数,如下面程序所示
#include <stdio.h>
void set1( double **x )
{
(*x)[0] = (*x)[1] = 1.0;
}
int main(void)
{
double x[2];
double *p = x;
set1( &p ) ;
printf( "%f\n%f\n", x[0] , x[1] );
return 0;
}
在此程序p
中,类型的指针指向double *
数组的第一个元素,并将类型的指针的地址double **
传递给函数。
但是,要更改数组的元素,只需将参数声明为具有类型就足够了,double *
因为在这种情况下,数组的元素已经通过使用指针间接传递了。
#include <stdio.h>
void set1( double *x )
{
x[0] = x[1] = 1.0;
}
int main(void)
{
double x[2];
set1( x ) ;
printf( "%f\n%f\n", x[0] , x[1] );
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句