Изменение базового адреса массива - PullRequest
1 голос
/ 17 июня 2019

Почему я не могу изменить базовый адрес массива? Это потому, что выделенная память будет потеряна? в этом случае я могу создать массив с помощью указателя и изменить то, на что указывает указатель, и выделенная память также будет потеряна, тогда в чем разница?

Ответы [ 2 ]

5 голосов
/ 17 июня 2019

Массивы - это объекты сами по себе, а не указатели.Рассмотрим более простой объект:

int a = 0;

Ожидаете ли вы, что сможете изменить его адрес?Конечно, нет.Объект - это область хранения с типом.Регион хранения идентифицируется по его адресу, поэтому вы не будете ожидать его изменения.И массивы тоже объекты.Когда вы объявляете

int b[8] = {0};

, вы объявляете объект размером восемь целых, который будет занимать некоторое пространство.Вы не можете изменить его адрес больше, чем можете изменить адрес любого единственного целого.

Возможно, вам сказали, что массивы являются указателями.Но они не!Они могут быть преобразованы, даже неявно, в указатель чаще, чем нет, но они по-прежнему являются объектными типами.Указатели часто заменяют массивы, потому что адрес первого элемента достаточен для достижения любого другого элемента с арифметикой указателя, но указатель не является самим объектом массива.Разница становится очевидной, когда вы проверяете их свойства объекта.Например:

sizeof(b) != sizeof(int*)

Объект b не является размером указателя, на самом деле это размер 8 целых чисел, вероятно, больше, чем указатель.

0 голосов
/ 17 июня 2019

Адреса всех переменных предварительно вычисляются на разных этапах компиляции.

В сгенерированном коде вы можете видеть, что переменный объект заменяется на

Static+k for static linkage
Stack+k for automatic linkage
Reg regname
Constant hardcoded

И это могут быть адреса других типов.

Указатель - это объект, адрес котороговычисляется, как указано выше, но значение которого может быть переменной указанного выше типа.

...