#define ArrayLength(x)(sizeof(x)/ sizeof(*(x)))是什么意思?

时间:2011-09-07 09:15:23

标签: c arrays pointers

这条线究竟意味着什么?

很清楚定义是什么,但我不明白为什么在分母处传递x的指针:

#define ArrayLength(x) (sizeof(x)/sizeof(*(x)))

感谢

3 个答案:

答案 0 :(得分:6)

分母

sizeof(*(x))

是数组中第一个元素的长度,以字节为单位。变量x是一个数组类型,它是 decays 指向一个指针,指向数组的开头。星号(*)是dereference operator,因此*(x)表示x指向的数据”

分子

sizeof(x)

sizeof运算符应用于数组类型。这给出了整个数组的长度,以字节为单位。

宏也可以写成

#define ArrayLength(x) (sizeof(x)/sizeof(x[0]))

这可能更容易阅读。

答案 1 :(得分:2)

该指针获取数组中的第一个对象。如果我这样写它会更清楚:

sizeof(entireArray) / sizeof(firstObjectInArray)

答案 2 :(得分:0)

事实证明是这样的

int a[]={1,2,3};
 foo(a, sizeof(a)/sizeof(a[0]));

在你的情况下将是

 foo(a, sizeof(a)/sizeof(1)); 

即整数大小

 foo(a, sizeof(a)/sizeof(int)); 

你也可以使用传递枚举作为常量的分母枚举可能是这样的

enum dataType {
    INT    = 2,
    fLOAT = 4,
    DOUBLE = 8
 }type;

这有助于将代码部署到不同的环境,例如从dos到Windows等,但我想在orignal片段中也可以这样。但枚举方法会增加我猜的性能。