2014-09-04 49 views
1

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

回答

4

x->y仅仅是这个

(*x).y 

语法糖貌似flexarray只是类型定义为*flexarrayrec,所以当你写flexarray result,编译器将 “改造” 它

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

所以result.capacity,例如,当指针只是一个数字(内存地址)时,它就没有意义,“它没有任何字段”。 (*result).capacity的工作,但它是令人沮丧写这么多星号和括号,这就是为什么我们使用->操作:)

1

x->y相当于到(*x).y(它是句法糖)

那我s,如果x是一个指针。 如果你的结构(或对象)不是指针,你可以使用xy(而不是x-> y)

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

0

flexarraystruct flexarrayrec类型的指针。所谓

typedef struct flexarrayrec *flexarray; 

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

但如果你已经声明

typedef struct flexarrayrec flexarray; // Static declaration 

现在你可以使用.点运算符来访问它的成员!

如果你想使用.意味着你可以后续

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