C ++: & a [2] - & a [1] ==? - PullRequest
       24

C ++: & a [2] - & a [1] ==?

7 голосов
/ 24 мая 2011

a - массив целых чисел, если я попытаюсь вычесть значение адреса из &a[2] - &a[1] == ?, каким должен быть результат 4 или 1?

EDIT : см. 4-й комментарийтоп ответ здесь почему он говорит 1 ??вот почему я запутался, я думал, что это будет 4

РЕДАКТИРОВАТЬ : вот тест

Ответы [ 6 ]

9 голосов
/ 24 мая 2011

&a[2] соответствует &(*(a + 2)) (т.е. (a + 2)), а &a[1] соответствует &(*(a + 1)) (т.е. (a + 1)).Так что ответ будет 1.

6 голосов
/ 24 мая 2011

Вычитание указателя дает вам разницу в элементах , а не в байтах. Неважно, какой тип элемента массива, результат &a[2] - &a[1] всегда будет равен 1, потому что они находятся на расстоянии 1 элемента.

4 голосов
/ 24 мая 2011

Это всегда 1. Арифметика указателя не связана с количеством байтов, которое имеет каждый элемент, и это очень полезно.Сравните их:

ptr++;  // go to the next element (correct)
ptr += sizeof *ptr;  // go to the next element (wrong)

Когда вы работаете с массивами, вы обычно интересуетесь элементами , а не байтами , содержащими их, и именно поэтому арифметика указателейв Си был определен таким образом.

3 голосов
/ 24 мая 2011

Разница должна быть 1. Когда вы сравниваете указатели, вы всегда получаете разницу элементов.

2 голосов
/ 24 мая 2011

Поскольку это C ++, я предполагаю, что вы не переопределяли операторы & или * для любого типа a. Учитывая это, верно следующее:

&a[2] - &a[1]
(a + 2) - (a + 1)
a + 2 - a - 1
2 - 1
1
1 голос
/ 24 мая 2011

Несколько ответов здесь (удалено с момента публикации этого ответа) явно имели в виду байт *:

    int a[10];
    byte * pA2 = (byte*)&a[2];
    byte * pA1 = (byte*)&a[1];
    int sz1 = &a[2] - &a[1];
    int sz2 = pA2 - pA1;
    CString msg;
    msg.Format("int * %d, byte * %d\n", sz1, sz2);
    OutputDebugString(msg);

Вывод:

     int * 1, byte * 4

Два адреса, но в зависимости отобъявление переменной, в которой хранятся адреса, разница между ними может быть 1 или 4.

...