2013-09-06 3 views
1
struct individual { 
    int element[100]; 
    int rank; 
} ; 

struct population{ 
    individual ind[10]; 
    individual *ind_ptr; 
} ; 

population p1,*p1_ptr; 

p1_ptr = &p1; 
p1_ptr->ind_ptr = &(p1_ptr->ind[0]); 
p1.ind[0].element[0] = 1; 
p1_ptr->ind_ptr->element[0] = 1; 

Последние два утверждения выражают одно и то же. Мне интересно, почему я должен использовать указатели? Есть ли преимущества указателей на индексы? Или есть предпочтение использования «.» И «->» в структурах? Большое спасибо.Почему мы используем указатели вместо индекса при обращении к элементам массива в structs

Я снова редактировал свои коды, исправляя ошибки, отмеченные akash_sinha13134 и Jonathan Leffler. И спасибо за комментарий mbratch. Большое спасибо.

+1

Существует множество причин, чтобы выбрать один против другого. Google «указатели против структур в C», и вы найдете хорошую информацию. Отчасти это связано с управлением памятью и данными. «Дешевле» передавать указатель на что-то вокруг, чем сам элемент, если этот элемент является «структурой» (обычно большим количеством байтов). И это необходимо, если ваша «структура» относится к другим структурам, которые уже существуют где-то в другом месте, поэтому в этом случае необходим указатель (вам не нужна копия, а указатель на фактический). В некоторых случаях это не имеет значения, сколько вы выбираете (например, в вашем надуманном случае). – lurker

ответ

0

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

Однако, если вы хотите использовать свой ind_ptr для указания на другой массив individual или изменить массив, который вы используете в своей совокупности во время выполнения, вам нужно использовать указатель там, и именно здесь этот подход будет быть полезным (в вашем случае это не так, и это может вас смутить).

s->f действительно просто ярлык для (*s).f, где s является указатель на структуру, содержащую поля f, так что нет никакой разницы там. (.)

3

Мне интересно, почему я должен использовать указатели?

У вас нет необходимости, это ваш выбор.

Есть ли преимущества указателей на индексы?

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

Есть ли предпочтения использования . и -> в struct с?

Нет, нет предпочтения: p->x альтернативный синтаксис для (*p).x, компилятор будет производить тот же треску для обеих конструкций.

0
struct abcd aABCDStruct; 
struct abcd * aPointerToABCDStruct; 

Dot используется для переменной структуры, а Arrow/indeirection (->) используется переменнуюуказатель на структуру.

Предполагая, что вы знали, что выше,
нет никакой разницы, как таковой, его только, что с помощью указателя на struct облегчает ваш плавный сдвиг в случае структур данных, которые вы используете, как связанный список. Мы можем перебирать следующую переменную списка, используя ptr->next.

1

хотя приведенный выше код будет показывать ошибку в C (не в C++) COz структуры tagname используется без ключевого слова struct (например, в строке population p1,*p1_ptr;) .. это чисто ваш выбор, чтобы использовать указатель в C для структуры или нет .. использование указателя может быть полезным/полезным в некоторых случаях, например, если u хочет вернуть более одного значения из функции типа struct, используя указатель, это возможно. но если вы не захотите использовать указатель u dont .. as просто как тот...также dot(.) operator и (->) operator те же и не имеют порядка предпочтения .. Единственная разница в их использовании ....

+0

Фактически, два определения 'struct' определяют переменные, называемые' individual' и 'population'; использование имени переменной в строке 'population p1, * p1_ptr;' приводит к ошибкам (и использование 'individual' в структуре' population' тоже делает). Хорошо подмечено! Даже в C++, который определяет переменные не типы; они должны были бы быть 'struct individual {...};', чтобы избежать определения переменных. –

0

Указатель является самодостаточным объектом: для доступа к целевому объекту все, что у вас есть сделать это разыменовать указатель. Указатели прямое управление абсолютное доступ.

Индекс не является самодостаточным субъектом: вы не можете получить доступ к чему-либо, зная только индекс. В дополнение к индексу вам нужно знать массив, к которому должен применяться этот индекс. Без массива индекс сам по себе бесполезен. Таким образом, индексы реализуют относительный доступ.

Указатели и индексы имеют свои плюсы и минусы, которые вытекают из вышеуказанного принципиального различия между ними. Но в ситуациях, когда они взаимозаменяемы (т. Е. Когда вы знаете, что массив всегда будет известен заранее), вы можете выбрать либо на основе ваших личных предпочтений.

Смежные вопросы