【问题标题】:How to pass an array of struct using pointer in c/c++?如何在 c/c++ 中使用指针传递结构数组?
【发布时间】:2011-01-22 13:54:17
【问题描述】:

在 C 代码中,我坚持将结构数组传递给函数,这是类似于我的问题的代码:

类型定义结构 { 诠释 x; 整数y; 字符 *str1; 字符 *str2; }结构1; void processFromStruct1(Struct1 *content[]); 主函数() { 结构1 mydata[]= { {1,1,"黑色","猫"}, {4,5,"red","bird"}, {6,7,"棕色","狐狸"}, }; processFromStruct1(mydata);//怎么样?!??找不到正确的语法 返回0; } 无效 processFromStruct1(Struct1 *content[]) { printf("%s", content[1]->str1);// 如果我想打印'red',这样对吗? ... }

msvc 中的编译错误是这样的:

错误 C2664:“processFromStruct1”:无法将参数 1 从“Struct1 [3]”转换为“Struct1 *[]” 1> 指向的类型是不相关的;转换需要 reinterpret_cast、C 样式转换或函数样式转换

如何解决这个问题? tnx。

【问题讨论】:

  • @mhd:虽然您的问题已被回答,但我建议您在开始编写代码之前先阅读一些书。读一本书会大大补充你的理解。

标签: c parameters struct


【解决方案1】:

你几乎拥有它,要么这个

void processFromStruct1(Struct1 *content);

或者这个

void processFromStruct1(Struct1 content[]);

并且,正如 Alok 在 cmets 中指出的那样,改变这个

content[1]->str1

到这里

content[1].str1

您的数组是结构数组,而不是指针数组,因此一旦您使用 [1] 选择特定结构,就无需进一步取消引用它。

【讨论】:

  • 并且content[1]->str1 变为content[1].str1
  • 他可能还想传递一个长度。
  • ...可以通过sizeof(mydata)/sizeof(mydata[0])获得,但只能在之前函数调用
  • @Adam: ...或通话后,但不是in通话:-)。
【解决方案2】:

试试

processFromStruct1( & mydata[ i ] ); // pass the address of i-th element of mydata array

方法

void processFromStruct1(Struct1 *content )
{
    printf("%s", content->str1);
        ...
}

(John Knoeller 和 Alok 已经注意到第二部分)。

【讨论】:

  • 然后不能用 1 索引该指针,只能使用 0。不确定这是否是 OP 想要的。类型也错误。
  • 好的,现在我对答案很满意。 +1。
【解决方案3】:

John Knoeller 给出了完美的语法,我试图解释一些基本的东西, 我希望它能解决你未来的困惑。 这与将指针传递给 C 中的函数非常相似。 当然struct也是一个指针,

所以我们可以通过两种方式传递值 0. 通过指针 0. 通过数组(因为我们使用的是结构数组)

所以现在问题很简单, 您必须像我们在普通指针中一样给出变量的数据类型, 这里的数据类型是用户定义的(这意味着 struct ) Struct1 然后是变量名, 该变量名可以是指针或数组名(选择兼容的方式)。

【讨论】:

    【解决方案4】:

    这对我有用。将结构更改为 C++ 样式。

    struct Struct1
    {
        int x;
        int y;
        char *str1;
        char *str2;
    };
    
    Struct1 mydata[]=
    {   {1,1,"black","cat"},
        {4,5,"red","bird"},
        {6,7,"brown","fox"},
    };
    
    void processFromStruct1(Struct1 content[]);
    
    int main()
    {
        processFromStruct1(&mydata[1]);    
        return 0;
    }
    
    void processFromStruct1(Struct1 content[])
    {
        printf("%s",content->str1);
    }
    

    输出:红色

    【讨论】:

    • 那不应该编译并且不是“C++风格”。在关键字上方,struct 必须位于 Struct1 名称之前。示例:void processFromStruct1(struct Struct1 content[]);
    【解决方案5】:

    也许是对未来的适当重构:

    #include <stdio.h>
    
    typedef struct
    {
       int x;
       int y;
       char *str1;
       char *str2;
    } struct_1;
    
    static void proc_the_struct_1_arr (
        const int count_ ,
        // array arg declared with min number of arguments
        // also can not be null
        struct_1 content[ static count_ ]
        )
    {
        for (unsigned j = 0; j < count_; ++j)
        printf("x:%-4dy:%-4d%-12s%-12s\n", content[j].x,content[j].y,content[j].str1,content[j].str2);
    }
    int main( void )
    {
        struct_1 mydata[3]= { 
          {.str1 = "black", .str2 = "cat" },
          {.str1 = "red",   .str2 = "bird"},
          {.str1 = "brown", .str2 = "fox" },
        };
    
        proc_the_struct_1_arr (3,mydata);
    
        return 0;
    }
    

    Godbolt

    显然proc_the_struct_1_arr 声明很有趣。这实际上使用了可变修改类型(VMT)。这是仅适用于数组参数的合法语法。

    这与指向数组解决方案的指针相比并不慢:

    static void proc_the_struct_1_arr_pointer (
        const int count_ ,
        // array arg not declared with min 
        // required number of arguments
        struct_1 (*arr_ptr)[ /* static no allowed here */ count_ ]
        );
    

    无论如何,我假设编译器将上述内容“重写”为数组指针。第二个选项arr_ptr 可以是空参数。

    【讨论】:

      【解决方案6】:

      您可以尝试将原型设为void processFromStruct1(Struct1 content[]);,然后声明应为void processFromStruct1(Struct1 content[])

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多