Почему мы должны назначить временный указатель на массив в для l oop? - PullRequest
0 голосов
/ 03 марта 2020

Я довольно новичок в C ++, и я пытаюсь понять, почему нам нужно назначить указатель на массив, предполагая, что размер массива известен как первая часть l oop здесь.

for(int * ptr = arr; ptr < arr + arrSize; ptr++)

Любая помощь будет оценена.

1 Ответ

3 голосов
/ 03 марта 2020

Для обозначений начальных массивов, используемых в выражениях с редкими исключениями, они преобразуются в указатели на свои первые элементы.

Таким образом, в этом объявлении

int * ptr = arr

создается локальная переменная ptr который будет указывать на первый элемент массива arr.

Это выражение

arr + arrSize

указывает на один последний элемент массива arr.

Таким образом, в пределах l oop из-за приращений указателя ptr все элементы массива последовательно доступны, пока указатель ptr не будет указывать на один за последним элементом массива.

Здесь является демонстрационной программой.

#include <iostream>

int main() 
{
    const size_t arrSize = 5;
    int arr[arrSize] = { 1, 2, 3, 4, 5 };

    size_t i = 0;
    for ( int *ptr = arr; ptr != arr + arrSize; ptr++ )
    {
        std::cout << "ptr = " << ptr << ", &arr[" << i << "] = " << &arr[i] << '\n';
        std::cout << "*ptr = " << *ptr << ", arr[" << i << "] = " << arr[i] << '\n';
        std::cout << '\n';

        i++;
    }

    return 0;
}

Ее вывод может выглядеть следующим образом:

ptr = 0x7ffeb74dbd00, &arr[0] = 0x7ffeb74dbd00
*ptr = 1, arr[0] = 1

ptr = 0x7ffeb74dbd04, &arr[1] = 0x7ffeb74dbd04
*ptr = 2, arr[1] = 2

ptr = 0x7ffeb74dbd08, &arr[2] = 0x7ffeb74dbd08
*ptr = 3, arr[2] = 3

ptr = 0x7ffeb74dbd0c, &arr[3] = 0x7ffeb74dbd0c
*ptr = 4, arr[3] = 4

ptr = 0x7ffeb74dbd10, &arr[4] = 0x7ffeb74dbd10
*ptr = 5, arr[4] = 5

Обратите внимание, что в этом выражении

arr + arrSize

используется так: вызываемая арифметика c. Например,

( arr + arrSize ) - arr

дает количество элементов arrSize между двумя выражениями указателя arr + arrSize и arr.

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