Привет, у меня есть вопрос по программированию на Си. Я хочу знать разницу между двумя и где один полезен над другим? - PullRequest
1 голос
/ 11 мая 2010

У меня вопрос по программированию на Си.

Я хочу знать разницу между двумя и где один полезен по сравнению с другим?

Предположим, у меня есть структура с именем employee, как показано ниже:

struct emp{
   char first_name[10];
   char last_name[10];
   char key[10];
};

Теперь я хочу сохранить таблицу записей сотрудников, затем какой метод мне следует использовать:

  1. struct emp e1[100]; // Or
  2. struct emp * e1[100];

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

Может кто-нибудь уточнить?

Ответы [ 4 ]

7 голосов
/ 11 мая 2010

Второй - это массив указателей для структурирования emp, что означает, что вам нужно выделить каждый элемент в куче. Преимущество состоит в том, что вам нужно выделить достаточно памяти только для того числа emp, которое у вас есть, но недостатком является то, что вам приходится управлять временем жизни каждого emp.

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

0 голосов
/ 11 мая 2010

Вы можете использовать первый подход, если вы знаете фактическое количество сотрудников (редко бывает) во время компиляции. С другой стороны, если вы не знаете количество сотрудников, еще проще не указывать количество ваших указателей, например:

emp * myEl = NULL;

Когда у вас есть количество сотрудников, скажем, nMyEmployees, вы можете выделить структуры, которые вы хотите, так:

myEl = new emp [nMyNumber];

и инициализировать их

memset (& myEl, 0x00, sizeof (emp));

Теперь вы готовы использовать их:

myEl [0] .first_name;

Обратите внимание, что вам нужно освободить эту память, когда вы закончите:

if (myEl! = NULL) удалить [] myEl;

0 голосов
/ 11 мая 2010

Первый - это массив структуры emp, а второй - указатель на массив структуры emp.

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

Для первого, если вы хотите сохранить какое-то значение, вам придется использовать - e1 [0] .key = 'k'; и прочитайте его обратно, используя

printf ("% c", e1 [0] .key);

А для второго вы должны получить доступ -> оператор

e1 [0] -> key = 'k'; и прочитайте его обратно, используя

printf ("% c", клавиша e1 [0] ->);

Разница в 1] В первом случае у вас есть переменная с адресом массива e1 [100]. 2] Во втором случае у вас есть переменная, которая указывает на адрес массива e1 [100].

0 голосов
/ 11 мая 2010

Второе, желательно, поскольку у вас могут быть пустые записи, что означает, что очень легко различить пустую или использованную запись.

Но я бы хотел использовать некоторые служебные функции для управления записями внутри списка.

Не знаю о чистом c, если есть что-то похожее на std :: list, если есть что-то подобное, я бы использовал это.

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