我有一个变量类型:
char (*p)[12] = calloc(n, sizeof(*p));
我需要变量保持这种方式,但由于函数类型给我错误,我无法将其作为参数传递:
void myMethod(char *p) { ... }
我可以在myMethod中使用什么作为使其工作的参数?
答案 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
我个人更喜欢后一种情况,因为你将函数传递给一个简单的指针,而不是通过所有元素的副本传递数组