Разве arrWithDigits
-это массив? Это же переменная, хранящая его адрес.Почему мы работаем с указателем как с массивом в этой строчке arrWithDigits[i] = i + 1;
?
#include <iostream>
#include <clocale>
using namespace std;
int main()
{
setlocale(LC_ALL, "rus");
int sizeOfArray = 0;
cout << "Чтобы создать массив чисел, введите его размер: ";
cin >> sizeOfArray;
int* arrWithDigits = new int [sizeOfArray];
for (int i = 0; i < sizeOfArray; i++)
{
arrWithDigits[i] = i + 1;
cout << arrWithDigits[i] << " ";
}
cout << endl;
delete [] arrWithDigits;
return 0;
}
Запись pointer[index]
это тоже самое, что и *(pointer + index)
, только удобнее.
Поэтому, например, можно (но не нужно) писать и так: index[pointer]
, это преобразуется в *(index + pointer)
, то есть разницы не будет.
В языках C и C++ встроенный оператор []
всегда работает с указателями и только с указателями. (Не совсем верно, см. поправку ниже).
Когда вы применяете встроенный оператор []
к объекту типа "массив", этот объект сначала незримо преобразуется к типу "указатель" (указывающий на начало массива), а затем уже к этому указателю применяется оператор []
.
Например, когда вы пишете
int a[10];
a[5] = 42;
языки С и С++ на самом деле внутренне интерпретируют этот код как
int a[10];
int *ptr = (int *) a; /* `ptr` указывает на начало `a` в памяти */
ptr[5] = 42;
а это, по определению оператора []
через операторы +
и *
, интерпретируется как
int a[10];
int *ptr = (int *) a; /* `ptr` указывает на начало `a` в памяти */
*(ptr + 5) = 42;
В вашем случае оператор []
сразу применен к указателю, то есть никаких незримых преобразований просто не нужно. С этой точки зрения можно даже утверждать, что использование оператора []
является, в некотором смысле, более естественным, чем использование этого оператора с массивами.
С педантичной точки зрения, вышесказанное справедливо только для С. В С++ оператор []
сначала преобразуется в эквивалентную форму через операторы +
и *
, а только затем в контексте оператора +
происходит преобразование массива к указателю. То есть в С++ (в отличие от С) мой пример проинтерпретируется как
int a[10];
*(a + 5) = 42;
а это уже, в свою очередь, интерпретируется как
int a[10];
int *ptr = (int *) a; /* `ptr` указывает на начало `a` в памяти */
*(ptr + 5) = 42;
Конечный итог, как видите, один и тот же, но абстрактная семантика несколько отличается.
(Спасибо @Croessmah за комментарий.)
Для указателя type* ptr
запись
*(ptr+i)
и
ptr[i]
по сути эквивалентны.
Так что arrWithDigits
- да, массив, просто в выделенном оператором new
месте в памяти.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Проблема видна на скринеВсе библиотеки подключены правильно
Хотел создать переменную типа map<string, vector<string>>, но чтобы пары в словаре хранились не по возрастанию, а в порядке добавления в словарьПолагаю,...
Ребят, помогите разобратьсяПытаюсь составить систему уравнений, чтобы можно было решить методом Гаусса
Написал приложение и скомпилировал егоПопытался запустить из QtCreator все нормально