1

我收到以下警告:

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 是输出参数,所以 state 应该是指向数组的指针,而 err 应该是指向二维数组的指针。

4

5 回答 5

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 浮点数数组的指针。

于 2012-07-20T15:15:46.370 回答
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;
}
于 2012-07-20T15:37:46.407 回答
2

在大多数情况下,数组类型的表达式将被转换为指针类型的表达式;这意味着当您将数组表达式作为参数传递给函数时,函数将接收到的是一个指针。此规则的例外情况是数组表达式是一元运算符sizeof或一元运算符的操作数&,或者是用于在声明中初始化数组的字符串文字。

在函数参数声明的上下文中,T a[]T a[N]被视为与T *a; 这三个都声明a为指向 的指针T,而不是 . 的数组T

所以,按照你的声明

float state[6];
float err[6][6];

表达式的类型state是“6-element array of float”,在大多数情况下将被转换为“pointer to float”,或者float *。同理,表达式的类型err为“6-element array of 6-element array of float”,将转换为“pointer to 6-element array of of float”,或者float (*)[6]

表达式的类型&state是“指向 6 元素数组的指针float”,orfloat (*)[6]的类型&err是“指向 6 元素数组的 6 元素数组的指针float”,或者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])

并且您不需要显式取消引用stateor err

state[i] = ...;
err[i][j] = ...;

那么,你用哪个?就个人而言,我会选择第二种选择;它更干净一点。

于 2012-07-20T17:33:43.537 回答
1

而在函数内部,T[][] 和 T** 几乎可以互换使用,但当它们作为参数传递时,有一些警告。“指针对指针”模式仅使用足够的内存来存储变量本身(通常与处理器的字长相同)并依赖程序员以某种方式生成正确的数据偏移量,而使用数组语法,编译器还需要知道结构的步幅,以便正确寻址行。出于这个原因,我个人不喜欢将数组作为参数传递:它使步幅在编译时固定。在我看来,最好始终使用带有行和列辅助参数的 T** 路线。

于 2012-07-20T15:35:58.533 回答
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 );

不用说,不是你的目标。

于 2012-07-20T19:43:45.193 回答