Чтобы понять это, вам просто нужно визуализировать, что переменные и указатели действительно означают с точки зрения областей памяти.
Компилятор и загрузчик программ будут выбирать реальные адреса памяти, и эти местоположения, вероятно, будут меняться при каждом запуске программы, поэтому мы просто составим некоторые значения для демонстрационных целей.
vecInventory
является векторным объектом, и он занимает некоторое количество памяти, потому что в нем есть некоторые данные, поэтому давайте просто для демонстрации скажем, что он хранится в памяти, начиная с адреса 100. Если вы пишете vecInventory
в программе это относится к векторному объекту.
&vecInventory
- адрес векторного объекта. Так что &vecInventory
- это просто число 100, потому что это ячейка памяти векторного объекта.
Так что теперь, когда вы передаете &vecInventory
в ptrToElement
, эта функция получает значение 100, которое она хранит в pVec
. Так что pVec
содержит число 100.
*pVec
означает вещь, хранящуюся в месте, указанном в указателе. pVec
содержит значение 100, которое является ячейкой памяти векторного объекта, поэтому *pVec
является векторным объектом.
Вы могли просто передать векторный объект vecInventory
в ptrToElement
напрямую, вместо того, чтобы передавать ячейку памяти векторного объекта, но передача значений в функцию означает копирование переданного значения. Поэтому, если вы передаете число (например, место в памяти), копируется только одно число, тогда как передача объекта напрямую может быть проблемой, если этот объект действительно большой, потому что копирование чего-то действительно большого может занять некоторое время. В этом случае это не имеет значения, потому что вектор маленький (данные, которые вы помещаете в вектор, не сохраняются в объекте вектора).
(*pVec)[i]
- это значение, хранящееся в записи i вектора. Помните, я говорил, что данные, которые вы помещаете в вектор, не сохраняются в объекте vector? Поэтому, когда в вашем примере i = 0, давайте просто скажем для демонстрации, что значение по индексу 0 вектора сохраняется в памяти, начиная с адреса 50.
&(*pVec)[i]
когда i = 0 - это число 50, потому что это место, где значение в индексе 0 хранится в памяти. Это означает, что значение, возвращаемое из ptrToElement(&vecInventory,0)
- это число 50.
*( ptrToElement(&vecInventory,0) )
означает вещь, хранящуюся в месте, указанном в указателе. ptrToElement(&vecInventory,0)
возвращает значение 50, которое является ячейкой памяти значения, хранящегося в индексе 0, поэтому *( ptrToElement(&vecInventory,0) )
является значением, хранящимся в индексе 0 векторного объекта.
Итак, в нашем примере:
vecInventory
- векторный объект (который хранится в ячейке памяти 100)
&vecInventory
- это ячейка памяти 100
pVec
- это ячейка памяти 100
*pVec
- векторный объект (который хранится в ячейке памяти 100)
(*pVec)[i]
когда i = 0 - это значение по индексу 0 вектора (которое хранится в ячейке памяти 50)
&(*pVec)[i]
- это ячейка памяти 50
ptrToElement(&vecInventory,0)
- это ячейка памяти 50
*( ptrToElement(&vecInventory,0) )
- это значение по индексу 0 вектора (которое хранится в ячейке памяти 50)