Я должен устранить одно сомнение, которое имеет ту же концепцию в 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) Как они распределены в памяти?
.
оператор ожидает, что его операнд будет выражением типа struct...
или union...
Оператор ->
ожидает, что его операнд будет выражением типа "указатель на struct...
" или "указатель на union...
".
tree
выражений имеет тип "указатель на struct Huffman
", поэтому вы используете оператор ->
для доступа к члену.
tree[i]
выражений tree[i]
имеет тип " struct Huffman
"; оператор подписи неявно разыгрывает указатель (помните, что a[i]
оценивается как *(a + i)
), поэтому вы используете .
оператора для доступа к члену.
В принципе, a->b
является несколько более читаемым эквивалентом (*a).b
.
(1): ->
- это просто ярлык для (*).
Например:
string s = "abc";
string *p_s = &s;
s.length();
(*p_s).length();
p_s->length(); //shortcut
Когда у вас есть указатель на экземпляр структуры, вы используете оператор стрелки: ->
.
Когда у вас есть переменный или прямой экземпляр структуры, вы используете оператор точки .
В этих случаях доступ к классам будет осуществляться одинаково, чтобы члены имели правильную доступность.
data
?