C 将指向结构的指针数组传递给函数

C 将指向结构的指针数组传递给函数,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,我有一个函数,其中声明了指向结构的指针数组 void functionA(argument1, argument2) { ... struct1 *point[2]; ... functionB(*point, ...) // Call the function ? } // Declare the function ? void functionB(struct1 *point[], ...) { } 我需要将这个数组*点[2]传递给另一个函数,比如funct

我有一个函数,其中声明了指向结构的指针数组

void functionA(argument1, argument2) {
   ...
   struct1 *point[2];
   ...

   functionB(*point, ...) // Call the function ?
}

// Declare the function ?
void functionB(struct1 *point[], ...) {


}
我需要将这个数组
*点[2]
传递给另一个函数,比如functionB,在这里我需要基于
点[0]
点[1]
执行一些操作,正确的方法是什么


当我在
function
中调用
functionB
functionB(*point,…)
一样时,我得到了不兼容指针类型的错误,而当我像
functionB(*point[],…)
我得到的错误是
]
标记之前预期的表达式

以下是一种方法:

void functionA(argument1, argument2) {
   ...
   struct1 *point[2];
   ...

   functionB(point, ...) // Call the function ?
}

// Declare the function ?
void functionB(struct1 ** point, ...) {

  // Use point[1] and point[2] here
}

你的函数调用是错误的<代码>函数B需要其类型为
struct1**
的参数,但您正在传递类型为
struct1*
的参数。函数调用应该是

functionB(point, ...);  

您应该知道,根据C规则,当数组传递给函数时,数组将衰减为指向它的第一个元素的指针<函数调用中的代码>点将衰减,衰减后将具有类型
struct1**

当需要向函数发送数组时,只需将该数组的基址(即名称)发送给该函数,然后使用指向该类型的指针接收它。这条规则适用于所有数据类型,无论是
int
还是
struct


那么,你能做什么

void functionA(argument1, argument2) {
   ...
   struct1 *point[2];
   ...

   functionB(point, ...) // Sending base address of array point
}

// Recieve it this way
void functionB(struct1 *point[], ...) {

// Or
void functionB(struct1 **point, ...) {

函数
functionB
被声明为具有类型为
struct1*point[]的第一个参数

void functionB(struct1 *point[], ...) {


}
并且数组
具有相同类型的元素

因此,您只需要使用数组的名称作为函数调用的参数

functionB(point, ...) // Call the function ?
考虑到声明为数组的参数被调整为指向其元素的指针

因此,这个函数声明

void functionB(struct1 *point[], ...);

是等价的,并声明同一个函数


另一方面,表达式中使用的数组指示符被转换为指向其第一个元素的指针。因此,用作参数的表达式
point
被转换为
struct1**
类型的指针,即根据其声明,它与函数参数所期望的完全对应。

您尝试过函数b(point)吗?我建议您替换
struct1*point[]
函数b的参数声明中,并将其替换为
struct1**point
以避免在函数中出现类似
sizeof(point)
的错误,因为这样做不起作用。您可以将数组作为参数传递,但它将“表示为(?不记得正确的术语)”指向被调用函数中的指针(指向第一个数组项)。如果在函数中声明数组,则可以在该范围内对该数组执行
sizeof
。这就是它可能具有误导性的原因。@Jite这里没有理由使用指向指针的指针。@Lundin它是用一般术语表示的,如果它是
struct*point
struct*point[]
struct**point
struct*point[]
(…)实际上并不重要。我试图指出的一点是,将函数参数指定为数组而不是(指针指向…)指针在我看来是一种不好的做法,可能会导致犯一些不必要的错误,如
sizeof
@Jite否。常识表明,将数组指定为期望数组的函数的参数是一种好的做法。这样做会导致代码的自文档化。碰巧,函数的数组参数将衰减为指向第一个对象的指针,但仅仅因为C语言具有这种奇怪的特性,并不意味着您应该在手动进行“衰减”的地方编写程序。它使类型兼容性检查(通过普通编译器以外的智能工具)变得不可能,并且使程序更难阅读。
functionB(struct1**point,…)
functionB(struct1*point[],…)
的意思是否相同?给定它们都是指向指针的指针是的。两者都是函数参数。如果此答案有任何错误,请发表评论。
void functionB(struct1 **point, ...);