Каково различие между &arr+1 и arr+1?

Оба выражения &arr+1и arr+1 они не дают тот же результат и это это подтверждают со следующим примером:

int main(void) 
{
    int arr[] = {40, 41, 42, 43};
    int* ptr = &arr+1;
    int*ptr2 = arr + 1;
    printf("%d, %d\n", *(ptr-1), *ptr2);
    return 0;
}

Результат из-за экрана:

43,41

Вопрос миллиона: Из-за которого в *(ptr-1) он дал как результат 43?

Porqué ясный, что *ptr2 он дает как оказанный один 41, благодаря тому, что, у него есть направление памяти второй составной части договоренности.

3
задан 21.12.2019, 22:58
1 ответ

ВїCual - различие между & arr+1 и arr+1?

Проблема состоит в том, что, хотя как arr, так и &arr имеют в виду ту же самую direcciГіn, однако не того же типа .

  • arr - типа "direcciГіn int" , так как он равняется тому, чтобы помещать &arr[0] и в arr[0] есть целое число, а следовательно arr - один direcciГіn целого числа.

  • Взамен &arr - типа "direcciГіn array 4 int" , так как действительно то, что есть в ней direcciГіn arr, является array 4 целых чисел.

Различие в типе затрагивает в aritmГ©tica указателей , который в cuГЎnto, увеличивается действительно, когда он прибавляется 1.

, Если ты имеешь по отношению к tipo любому указатель, и ты складываешь 1 в указатель, в действительности sumarГЎ sizeof(tipo), для asГ - указывать на следующий элемент этого же самого типа. Следовательно:

  • arr+1, так как, поскольку мы увидели arr, он указывает на целое число, sumarГЎ в действительности sizeof(int), которые являются обычно 4 байт. Следовательно ptr2 в тебе cГіdigo apuntarГЎ в одну posiciГіn, что estГЎ 4 байт despuГ©s начала array. AsГ - так как apuntarГЎ в следующее целое число.

  • &arr+1, так как, поскольку мы увидели &arr, он указывает на array 4 целых чисел, sumarГЎ в действительности sizeof(arr), которых в этом случае 4*sizeof(int), и serГЎn следовательно 16 байт (понимая, что sizeof(int) 4). AsГ - так как quedarГ - в указывая на один hipotГ©tico array четырех целых чисел, что irГ - в despuГ©s arr, хотя у тебя нет такой вещи в программе. Указатель ptr следовательно estГЎ распределенное зло и в самом деле не совпадают типы, так как ты объявил такие ptr как указатель int, но ты распределяешь ему указатель в array 4 ints. TendrГЎs warning в этой lГ-nea.

Все предыдущее показывается этой программой:

int main()
{
   int arr[] = {40, 41, 42, 43};
   int *ptr = &arr+1;
   int *ptr2 = arr + 1;

   printf("%p %p\n", &arr, arr);
   printf("%p %p\n", ptr, ptr2);

}

Цепь формата %p обычно используется, чтобы переворачивать стоимость указателей. В действительности просто они переворачивают в шестнадцатеричном ее direcciГіn в cuestiГіn. В первом printf() мы переворачиваем ее direcciГіn arr и [1127] &arr, чтобы подтверждать, что оба равны. Во втором printf() мы переворачиваем стоимость указателей подтверждать, что первый увеличился в 16 и втором в 4, относительно нее direcciГіn array.

Она ejecuciГіn производит:

0x7ffeeb0ad900 0x7ffeeb0ad900
0x7ffeeb0ad910 0x7ffeeb0ad904

, которые совпадают с ожидаемым (он помнит, что шестнадцатеричных 10 16)

ВїPor, что в *(ptr-1) дал как результат 43?

, Потому что благодаря тому, что ты объявил ptr int как меткого типа, она artimГ©tica указателей ptr-1 он restarГЎ в действительности sizeof(int), или же 4 байт. Давайте помнить, что segГєn explicГі раньше ptr указывал на 16 байт mГЎs allГЎ начала arr, а именно, в первую posiciГіn он "был" этому array. После того, как отрицает у него 1 в указатель (4 байт у нее direcciГіn) останься указывая в Гєltimo на элемент arr.

6
ответ дан 22.12.2019, 22:45

Теги

Похожие вопросы