разница между оператором точки и оператором стрелки по переменной объекта структуры для создания дерева в c или c ++

0

Я должен устранить одно сомнение, которое имеет ту же концепцию в c и c++.

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

struct Huffman
{
    int value;
    unsigned char sym;                 /* symbol */
    struct Huffman *left,*right;    /* left and right subtrees */
};

typedef struct Huffman Node;
Node * tree;

и теперь я создаю дерево, используя древовидную переменную. Затем используйте оператор точки и оператор стрелки. как это.

Оператор Arrorw:

 for (i = 0; i < data_size; i++) 
    {
         // the problem is here this tree pointer don't store the values for all alphabets, it just remembers the last executed alphabet after this for loop.
        tree -> left = NULL;
        tree  ->right = NULL;
        tree -> symbol = storesym[i];
        tree  -> freq = storefreq[i];
        tree -> flag = 0;
        tree -> next = i + 1;
        cout<<"check1 : "<<tree -> symbol<<endl;
    } 

Оператор точки:

for (i = 0; i < data_size; i++) 
{
    tree[i].symbol = storesym[i];
    tree[i].freq = storefreq[i];
    tree[i].flag = 0;
    tree[i].left = tree[i].right = tree[i].value = NULL;
    tree[i].next = i + 1;
}

Теперь я не могу понять, что (1) в чем разница между ними? (2) Как они распределены в памяти?

  • 1
    Что такое data ?
  • 0
    @JosephMansfield я только что отредактировал, это было по ошибке. это было дерево на самом деле
Теги:

3 ответа

1
Лучший ответ

. оператор ожидает, что его операнд будет выражением типа struct... или union... Оператор -> ожидает, что его операнд будет выражением типа "указатель на struct... " или "указатель на union... ".

tree выражений имеет тип "указатель на struct Huffman ", поэтому вы используете оператор -> для доступа к члену.

tree[i] выражений tree[i] имеет тип " struct Huffman "; оператор подписи неявно разыгрывает указатель (помните, что a[i] оценивается как *(a + i)), поэтому вы используете . оператора для доступа к члену.

В принципе, a->b является несколько более читаемым эквивалентом (*a).b.

  • 0
    Вы очень близки к тому, что я хочу знать. На самом деле причина проблемы - вопрос, который я задал по этой ссылке, но до сих пор нет ответа. Пожалуйста, помогите мне, На самом деле я создавал дерево (сначала с помощью оператора точки, а затем с помощью ->, поэтому оператор точки я сделал успешно но я не смог сделать эквивалент для оператора ->, вот ссылка) stackoverflow.com/questions/21910872/…
  • 0
    Я также не смог понять, как [i] = * (a + i), не могли бы вы объяснить немного подробнее.
Показать ещё 1 комментарий
4

(1): -> - это просто ярлык для (*). Например:

string s = "abc";
string *p_s = &s;
s.length();
(*p_s).length(); 
p_s->length(); //shortcut
  • 0
    Спасибо за помощь, но я попытался создать дерево по этой ссылке stackoverflow.com/questions/21910872/… Проблема заключалась в том, что я смог сделать это с помощью оператора точки, но все еще не смог сделать это с помощью оператора стрелки, не могли бы вы помочь мне в ссылку, которую я тебе дал? На самом деле эта проблема побудила меня задать вопрос об этом операторе точки и операторе стрелки.
1

Когда у вас есть указатель на экземпляр структуры, вы используете оператор стрелки: ->.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню