Что означает #define ArrayLength (x) (sizeof (x) / sizeof (* (x)))? - PullRequest
4 голосов
/ 07 сентября 2011

Что именно означает эта строка?

Понятно, что такое определение, но я не понимаю, почему передается указатель х в знаменателе:

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

спасибо

Ответы [ 3 ]

7 голосов
/ 07 сентября 2011

Знаменатель

sizeof(*(x))

- это длина первого элемента в массиве в байтах. Переменная x относится к типу массива, и она распадается на указатель, указывающий на начало массива. Звездочка (*) - это оператор разыменования , поэтому *(x) означает "данные, на которые указывает x" .

Числитель

sizeof(x)

применяет оператор sizeof к массиву типа . Это дает длину всего массива в байтах.

Макрос также можно записать как

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

, который, возможно, легче читать.

2 голосов
/ 07 сентября 2011

Этот указатель получает первый объект в массиве.Будет ли понятнее, если я напишу это так:

sizeof(entireArray) / sizeof(firstObjectInArray)
0 голосов
/ 07 сентября 2011

получается что-то вроде этого

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 и т. д., но я думаю, что это может быть правдой воригинальный фрагмент также.но подход enum увеличит производительность, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...