Использование оператора разыменования в векторах C++
Разница между 1) и 2) и каковы будут их значения:
1) double h = (*Jill_data)[5];
2) double h = *Jill_data[5];
когда у нас есть vector<double>* Jill_data
с данными: {2, 4, 6, 8, 10, 12, 14, 16}.
3 ответа
Говоря о приоритетах операторов на картинке, как упомянуто FedeWar, следующий псевдокод в стиле C++ может сделать его более понятным:
double h1 = Jill_data . DeferenceThePointer . Access_Index_5;
double h2 = Jill_data . Access_Index_5 . DeferenceThePointer;
В первом случае Jill_data
будет разыменована (указатель-косвенность), который будет работать, так как Jill_data
это указатель Это дает vector
объект. Затем он обращается к индексу, который вызывает vector::operator[]
которая является действительной операцией. Вы получаете double
значение.
Во втором случае вы получаете доступ к 6-му элементу ([5]
) из Jill_data
, который действителен, и это дает vector
, Затем вы пытаетесь позвонить operator*
по вектору, который не реализован vector
класс, следовательно, вы получите "Неверное косвенное обращение" или аналогичную ошибку. Это в любом случае не может быть назначено double
Второй не скомпилирует, оператор []
имеет более высокий приоритет, чем *
, Вы не можете получить доступ к методу, который вы должны использовать ->operator[]
Кроме того, вы не можете разыменовать двойной номер.
1) Указатель Jill_data
будет разыменован, а затем вы получите доступ к 5-му элементу с [5]
: 12.
2) не будет компилироваться.