我收到以下警告:
expected ‘float **’ but argument is of type ‘float (*)[6]’
这是我的代码:
//state and error are output parameters
void func(float* state[6], float* err[6][6]);
int main()
{
float state[6];
float err[6][6];
func(&state, &err);
return 0;
}
我希望state和err成为ouptut参数,因此state应该是指向数组的指针,而err应该是指向2维数组的指针。
答案 0 :(得分:5)
将您的代码更改为:
void func(float state[], float err[][6]);
int main()
{
float state[6];
float err[6][6];
func(state, err);
return 0;
}
要理解原因,你需要知道float* err[6][6]
是一个6x6浮点数指针数组,而不是指向6x6浮点数组的指针。
答案 1 :(得分:3)
#include <stdio.h>
void func(float (*state)[6], float (*err)[6][6]){
printf("%f, %f\n", (*state)[2], (*err)[1][2]);//3.000000, 3.300000
}
int main()
{
float state[6]={1.0f,2.0f,3.0f};
float err[6][6]={{1.0f,2.0f,3.0f},{1.1f,2.2f,3.3f}};
func(&state, &err);
return 0;
}
答案 2 :(得分:2)
在大多数情况下,数组类型的表达式将转换为指针类型的表达式;这意味着当您将数组表达式作为参数传递给函数时,函数将接收的是指针。此规则的例外情况是,数组表达式是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化数组的字符串文字。
在函数参数声明的上下文中,T a[]
和T a[N]
被视为与T *a
相同;所有这三个都将a
声明为T
的指针,而不是T
的数组。
所以,按照你的声明
float state[6];
float err[6][6];
表达式state
的类型是“float
的6元素数组”,在大多数情况下,它将转换为“指向float
的指针”或{{1} }。类似地,表达式float *
的类型是“6元素数组err
”的6元素数组,它将被转换为“指向float
的6元素数组的指针”或float
。
表达式float (*)[6]
的类型是“指向&state
的6元素数组的指针”,或float
,float (*)[6]
的类型是“指向6的指针 - &err
“或float
的6元素数组的元素数组。
因此,如果对float (*)[6][6]
的调用是
func
然后原型必须
func(&state, &err);
在应用任何下标之前,您需要明确取消引用void func(float (*state)[6], float (*err)[6][6])
和state
:
err
如果电话是
(*state)[i] = ...;
(*err)[i][j] = ...;
然后原型必须
func(state, err);
您
void func (float *state, float (*err)[6])
那么,你用哪个?就个人而言,我会选择第二种选择;它有点清洁。
答案 3 :(得分:1)
在函数内部,T [] []和T **几乎可以互换使用,当它们作为参数传递时会有一些警告。 “指针指针”模式仅使用足够的内存来存储变量本身(通常与处理器的字大小相同),并依赖于程序员以某种方式生成正确的数据偏移,而使用数组语法,编译器还需要知道结构的步幅,以便它可以正确地处理行。就个人而言,我个人并不喜欢将数组作为参数传递:它使得在编译时固定步幅。在我看来,更好的是总是使用行和列的辅助参数去T **路线。
答案 4 :(得分:0)
void func(float* state[6], float* err[6][6]);
int main()
{
float state[6];
float err[6][6];
func(&state, &err);
return 0;
}
以下两个声明都是相同的......
char *message = "Hello World!";
char message[13] = "Hello World!"; /* "Hello World!" is 12 chars + \0 termination */
数组是指针,只是区别对待。
因此,要将这两个声明中message
的地址传递给func1(char *)或func1(char []),你要说func1(message);
传递地址。
数组只能作为地址传递给第一个值。运行以下程序来证明这一事实。
#include <stdio.h>
void func(float* array);
int main()
{
float state[6];
int i = 0;
printf ( "Sizeof state: %d\n", sizeof(state) );
for ( i = 0; i < 6; i ++ ) { state[i] = i+1; }
func(state);
return 0;
}
void func ( float *array )
{
printf ( "Sizeof float: %d\n", sizeof(float) );
printf ( "Sizeof array: %d\n", sizeof(array) );
printf ( "Value in array[0] = %f\n", array[0] );
printf ( "Value in *array = %f\n", *array );
array++;
printf ( "Value in array[-1] = %f\n", array[-1] );
printf ( "Value in array[0] = %f\n", array[0] );
printf ( "Value in *array = %f\n", *array );
}
因此,您对func(float* state[6], float* err[6][6] );
的调用声明了一个2级指针和一个3级指针。使用func(float **state, float ***err );
不用说,不是你的目标。