C数组和指针参数

时间:2012-07-20 15:13:29

标签: c arrays pointers parameters

我收到以下警告:

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

5 个答案:

答案 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元素数组的指针”,或floatfloat (*)[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 );

可以实现类似的功能,但同一个呼叫

不用说,不是你的目标。