繁体   English   中英

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

[英]How do I pass a char(*)([long unsigned int]) as a parameter in C?

我有一个变量类型:

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

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

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

我可以在myMethod中使用什么作为参数来完成这项工作?

我可以在myMethod中使用什么作为参数来完成这项工作

可能是这样的:

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

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

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

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

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

如果必须坚持不更改指针,则可以使用const限定符。

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

在前面的示例中,您尚未定义12个元素的数组,每个元素都是指向char的指针, 指向包含12个char元素的数组的指针。

如以下各行所述:

int *a[3];

从开始。 向右看,说出大小为3的数组。向左看,说出指针。 向右看,什么也看不到。 向左看,说出int。 大家都说a是一个大小为3的int指针数组。

添加括号是当它变得怪异的时候:

int (*a)[3];

括号就像在表达式中一样更改顺序。 当您在右边看时,您会看到右括号,除非您向左看,否则您不能跳过它。 因此,您会说a是指向3个整数的数组的指针。

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


不过,如果要将数组传递给函数,则可以复制它,或者由于它是数组,所以将指针传递给第一个元素(您可以使用数组的名称来完成此操作):

myMethod( p ) <- how you call the function

我个人更喜欢后一种情况,因为您要向函数传递一个简单的指针,而不是将其所有元素的副本作为数组

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM