【问题标题】:Difference in function declaration C函数声明C的区别
【发布时间】:2013-03-28 15:51:49
【问题描述】:

如果我这样声明函数,C语言有什么不同:

Type * AK_init_observer();

像这样:

Type* *AK_init_observer();

【问题讨论】:

  • 是的,第二个返回一个双指针(Type**)

标签: c pointers function-pointers


【解决方案1】:

是的,返回类型不同。第一个返回指向Type 的指针,而第二个返回指向Type 的指针。

【讨论】:

    【解决方案2】:

    是的,有区别。

    • 在第一种情况下,AK_init_observer 返回指向Type (Type *) 的指针。
    • 在第二种情况下,AK_init_observer 返回指向Type (Type **) 的指针。

    由于这里的空格无关紧要,所以这两个声明等价于:

    Type *AK_init_observer();
    

    和:

    Type **AK_init_observer();
    

    参考文献

    C11 (n1570),§ 5.1.1.1 程序结构

    7) 分隔标记的空白字符不再重要。

    【讨论】:

      【解决方案3】:

      使用众所周知的类型更容易理解,比如int,而不是Type:

      int *f1();
      

      返回一个指向 int 的指针。你可以跟着指针找到int:

      int *p = f1();
      printf("%d\n", *p);
      

      但是:

      int **f2();
      

      返回一个指针,它指向另一个指针,它指向 int:

      int **p1 = f2();
      int *p2 = *p1;
      printf("%d\n", *p2);
      

      【讨论】:

        【解决方案4】:

        是的,在第二个中,您将返回指向指针的指针。例如:

        char *function();             // Returns a pointer to a char - or a 'string'
        
        
        char **function();            // Returns an array of strings
        

        【讨论】:

        • 字符串和字符指针的区别很棘手,这让这个答案很混乱。
        • 除了与它无关之外,字符串通常是char *。
        • 哦,我现在明白了,我的 cmets 输入错误了。伙计,这就是我匆忙做事的结果。我已经编辑了我的答案。非常感谢你们
        猜你喜欢
        • 1970-01-01
        • 2016-01-03
        • 2011-08-14
        • 2011-09-20
        • 2012-11-23
        • 2010-10-03
        • 2015-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多