【问题标题】:C: Pointer after function callC:函数调用后的指针
【发布时间】:2014-07-31 14:05:33
【问题描述】:

我必须遵循 C 代码:

a.b[(c+d(e,f,g)**i)]->j<-k

现在我必须添加代码以使其编译。

大部分都不是问题,但真正让我恼火的是d(e,f,g)**i 部分。 **i据我了解是指向指针的指针,但不知道函数调用后如何直接处理。

【问题讨论】:

  • 这实际上是一个乘法,然后是指针解引用:d(e, f, g) * *i
  • 你到底在哪里找到的。
  • 这是编译器构造考试中提出的问题。

标签: c pointers


【解决方案1】:

把它分解一下:

d(e,f,g)**i

FunctionCall d with params e,f,g
Multiplied by
pointer-dereferce of i

或者:

 d    (e,f,g)     *          (*i)
Func. Params  Multiply value-stored-at-pointer

【讨论】:

    【解决方案2】:

    够简单

    d(e,f,g) * *i // where d(e,f,g) is a function which should return a value and
    *i is a pointer value
    Eg if function d(e,f,g) returns 10 and if *i=5 then then output will be 10*5 = 50
    

    【讨论】:

      【解决方案3】:

      嗯,这是相对可怕的。让我们由内而外地工作,并在处理它们时删除它们:

      1. d 是一个有 3 个参数的函数。假设它可以返回一个 int,如果不能,我们稍后再处理:

        int e, f, g;
        int d(int, int, int);
        
      2. 如果 i 是指向 int 的指针,d(e,f,g) * *i 就可以了。

        int *i;
        
      3. 如果 c 也是一个 int,c + d(e,f,g) * *i 就可以了。

        int c;
        
      4. 所以现在我们已经完成了括号的内部。我们还希望它是一个整数,以便它可以用作数组表示法。所以我们在那里很好。让我们在没有解决的一些问题的情况下重写问题。

        a.b[<some integer>]->j < -k
        
      5. 我们可以很容易地做右边。

        int k;
        
      6. 这部分很难用语言表达,但我只是在走类型。 b 是双星,因为它使用数组括号后跟 -> 符号。

        struct {
            struct {
                int j;
            } **b;
        } a;
        

      所以我们最终得到:

      #include <stdlib.h>
      
      int main() {
          int e, f, g;
          int d(int e, int f, int g);
          int *i;
          int c;
          int k;
          struct {
              struct {
                  int j;
              } **b;
          } a;
      
          a.b[(c+d(e,f,g)**i)]->j<-k;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-16
        • 2011-01-29
        • 2016-05-28
        • 1970-01-01
        • 2016-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-05
        相关资源
        最近更新 更多