如何在C中传递char(*)([long unsigned int])作为参数?

时间:2012-03-03 16:14:53

标签: c parameters char

我有一个变量类型:

char (*p)[12] = calloc(n, sizeof(*p));

我需要变量保持这种方式,但由于函数类型给我错误,我无法将其作为参数传递:

void myMethod(char *p) { ... }

我可以在myMethod中使用什么作为使其工作的参数?

4 个答案:

答案 0 :(得分:4)

  

我可以在myMethod中使用什么作为使其工作的参数

可能是这样的:

void myMethod(char (*p)[12])

答案 1 :(得分:2)

对参数使用与变量相同的类型:

void myMethod(char (*p)[12])
{
  // do something with p
}
...
char (*p)[12] = calloc(n, sizeof *p);
myMethod(p);

请记住,p是指向char的12个元素数组的指针,而不是指向char的简单指针。因此,p[i]的类型将为char [12](在大多数情况下会衰减到char *)。

答案 2 :(得分:0)

典型的C惯用法是传递char*size_t(或unsigned int或任何等效的)参数。然后函数的契约是它将size_t参数视为数组/缓冲区的长度。

如果您必须坚持不更改指针,请使用const限定符。

答案 3 :(得分:-2)

char (*p)[12] = ...

使用前面的 NOT 定义了一个包含12个元素的数组,每个元素都是一个指向char BUT 的指针指向包含12个char元素的数组的指针。

如以下几行所述:

int *a[3];

从a开始。向右看,说大小为3的数组。向左看并指出指针。向右看,什么也看不见。向左看,说出int。总之,你说a是一个大小为3的指向int的数组。

添加括号是指它变得奇怪:

int (*a)[3];

圆括号改变顺序,就像在表达式中一样。当您在a之后看时,您会看到右括号,在您向左看之前不能跳过。因此,你会说a是一个指向3个整数数组的指针。

检查这些链接以获得更好的解释:


如果你想将数组传递给一个函数,你可以复制它,或者因为它是一个数组传递一个指向第一个元素的指针(你可以通过使用数组的名称来完成):

myMethod( p ) <- how you call the function

我个人更喜欢后一种情况,因为你将函数传递给一个简单的指针,而不是通过所有元素的副本传递数组

相关问题