может перераспределить массив, тогда зачем использовать указатели? - PullRequest
2 голосов
/ 14 октября 2008

Это было собеседование по трудоустройству, с которым я столкнулся. Они спросили, можем ли мы перераспределить массив, я ответил да. Затем они спросили - тогда зачем нам нужны указатели, так как большинство людей объясняет, что это тратит место в памяти. Я не мог дать удовлетворительный ответ. Если какой-либо орган может дать удовлетворительный ответ, я буду обязан. Пожалуйста, укажите любую ситуацию, в которой приведенное выше утверждение может противоречить.

Спасибо.

Ответы [ 4 ]

8 голосов
/ 14 октября 2008

Вы можете перераспределить только массив, который был выделен динамически. Если он был распределен статически, его нельзя перераспределить [безопасно]. *

Указатели содержат адреса данных в памяти. Они могут быть выделены, освобождены и перераспределены динамически, используя операторы new / delete в C ++ и malloc / free в C.

Я настоятельно рекомендую вам прочитать Язык программирования C Кернигана и Ричи, а также твердый текст C ++, например C ++ с нуля Гербертом Шильдтом.

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

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

5 голосов
/ 14 октября 2008

Формулировка немного странная, но мне кажется, что вопрос об интервью был открытым вопросом, призванным объяснить вам, что вы знаете о массивах, указателях, динамическом распределении памяти и т.д. хотел бы, чтобы кандидат сформулировал различия между int *a = malloc(10 * sizeof(int)); и int a[10];. Следующий вопрос сформулирован не очень хорошо, но, вероятно, это была попытка подтолкнуть кандидата в направлении разницы между указателем и массивом и начать ход мыслей.

2 голосов
/ 14 октября 2008

OK. Вы не можете перераспределить массив, который был объявлен статически. Цель использования указателей (вместо статически объявленного массива) состоит в том, чтобы вы могли перераспределить пространство. Я думаю, чтобы быть технически правильным, вы могли бы перераспределить статически определенный массив, передав указатель на него, но я бы не хотел. Поведение не определено, если указатель на память, которая не была выделена malloc.

1 голос
/ 14 октября 2008

Я не очень понимаю, как использование указателей "тратит память". Функция realloc: -

void *realloc(void *ptr, size_t size);

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

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