【问题标题】:Why am I using x->y = z instead of x.y = z in my C code?为什么我在 C 代码中使用 x->y = z 而不是 x.y = z?
【发布时间】:2014-09-04 05:53:45
【问题描述】:

我按照说明为灵活数组创建代码,并被告知要使用 x->y = z 而不是 x.y = z。使用指针而不是通常分配值的原因是什么?

此代码包含一个自定义库 flexarray.h,我将其放在底部

flexarray.c:

struct flexarrayrec{
   int capacity;
   int itemcount;
   int *items;
};

flexarray flexarray_new(){
   flexarray result = emalloc(sizeof *result);
   result->capacity = 2;
   result->itemcount = 0;
   result->items = emalloc(result->capacity * sizeof result->items[0]);
   return result;
}

flexarray.h:

#ifndef FLEXARRAY_H_
#define FLEXARRAY_H_

typedef struct flexarrayrec *flexarray;

extern void flexarray_append(flexarray f, int item);
extern void flexarray_free(flexarray f);
extern flexarray flexarray_new();
extern void flexarray_print(flexarray f);
extern void flexarray_sort(flexarray f);

#endif

【问题讨论】:

    标签: c pointers struct abstract-data-type


    【解决方案1】:

    x->y 只是语法糖

    (*x).y
    

    看起来flexarray 只是*flexarrayrec 的typedef,所以当你写flexarray result 时,编译器会将它“转换”为

    flexarrayrec *result = emalloc(sizeof(flexarrayrec));
    

    例如,result.capacity 没有任何意义,因为指针只是一个数字(内存地址),“它没有任何字段”。 (*result).capacity 会起作用,但是写这么多星号和括号很令人沮丧,这就是我们使用-> 运算符的原因:)

    【讨论】:

      【解决方案2】:

      x->y 等价于(*x).y(它是语法糖)

      也就是说,如果 x 是一个指针。 如果您的结构(或对象)不是指针,则可以使用 x.y(而不是 x->y)

      在您的情况下,您必须使用动态分配(指针),因为您想在函数 flexarray_new() 之外使用 flexarray。

      【讨论】:

        【解决方案3】:

        您的flexarraystruct flexarrayrec 类型的指针。所以-

        typedef struct flexarrayrec *flexarray;
        

        当你有结构指针时,你必须使用-> 箭头操作符来访问结构成员!

        但是如果你已经声明了

         typedef struct flexarrayrec flexarray; // Static declaration
        

        现在您可以使用. 点运算符来访问其成员!

        如果你想用.表示你可以关注-

        (*x).y = z instead of x->y = z;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-02
          • 1970-01-01
          • 1970-01-01
          • 2013-02-26
          • 2014-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多