Использование оператора разыменования в векторах 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) не будет компилироваться.

Другие вопросы по тегам