2014-02-12 3 views
1

Следующий код - это тот, который я написал для себя, чтобы проверить, как работают указатели и векторы.Что не так с этим простым кодом с векторами?

Я очень новичок в C++.

#include <vector> 
#include <iostream> 

using namespace std; 

int main(void) 
{ 
    //Create the integer pointer vector, and clean it to initialize 
    vector<int *> lol; 
    lol.clear(); 

    //Create the pointers and point them to 1,2,3 
    int a1=1, a2=2, a3=3; 
    int* a, b, c; 
    a=&a1; 
    b=&a2; 
    c=&a3; 

    //Put the pointers into the vector 
    lol.push_back(a); 
    lol.push_back(b);  
    lol.push_back(c); 

    //Return the value of the middle pointer 
    cout << *lol[1]; 
} 

Я получаю целую стену ошибок при компиляции.

Может ли кто-нибудь помочь? Имейте в виду, я могу только понять новичков.

+2

Вам не нужно очищать сразу после объявления. –

+0

Пожалуйста, не забудьте опубликовать полный текст ошибки в будущем. – chris

ответ

0

При объявлении нескольких указателей на одной строке вам необходимо указать символ * перед каждой переменной указателя.

int * a, b, c; 

должно быть:

int *a, *b, *c; 

Линия:

int * a, b, c; 

интерпретируется как:

int *a; 
int b; 
int c; 
4

Проблема с этой линии:

int* a, b, c; 

a является int*, но b и c просто int s.

int *a, *b, *c; 

Сделать все это int* s.

int* a; 
int* b 
int* c; 

делает то же самое, но с более четкими намерениями объявить три int* с.

См: Placement of the asterisk in pointer declarations

UPDATE: Даже лучше:

int* a = &a1; 
int* b = &a2; 
int* c = &a3; 

Всякий раз, когда вы можете, не отделяем инициализации переменных и ее декларации.

0

Изменить этот

int* a, b, c; 

в

int *a, *b, *c; 

В вашем объявлении вы объявляете

a as pointer to int 
b as int 
c as int 
0

Если вы объявляете переменные, не объявить несколько переменных в одной строке.

Как вы думали, это было объявление трех указателей на int.То, что вы сделали, было объявить три Интс, один из них указатель:

int* a, b, c; 

означает

int *a; int b; int c; 

думать о * как принадлежащие к имени переменной. Неинтуитивный, но так работает язык.

Вы хотите объявить все три как указатели:

int* a; 
int* b; 
int* c; 
0

главная проблема, как и другие уже отмечалось, являются определения здесь:

int* a, b, c; 

В основном , только a - int *; b и c - это только int s.

Это просто лучше иметь один определение переменной в каждой строке:

int* a = &a1; 
int* b = &a2; 
int* c = &a3; 

Если вы используете эти сырые указатели, и если по какой-то причине вы хотите, чтобы сначала определить их, а затем присвоить их значения позже, рассмотрим по крайней мере инициализация их nullptr (или NULL, если вы используете C++ 98/03):

// Initialize to NULL/nullptr, to avoid pointers pointing to junk memory 
int* a = nullptr; 
int* b = nullptr; 
int* c = nullptr; 

.... 

// assign proper values to pointers... 

Кроме того, есть и другие замечания, которые могут быть сделаны для вашего кода:

int main(void) 

Поскольку это C++ - не C - вы можете опустить (void), и просто использовать () вместо:

int main() 

Когда вы создаете vector:

vector<int *> lol; 
lol.clear(); 

вам не нужно вызвать его метод clear() после определения вектора: на самом деле, конструктор по умолчанию вектора (неявно вызывается компилятором при определении вектор в первой строке) уже инициализировал вектор пустой вектор.
Это просто отлично:

vector<int *> lol; // Creates an empty vector 

Учитывая эти заметки, ваш код может быть написано что-то вроде этого:

#include <iostream> 
#include <vector> 
using namespace std; 

int main() 
{ 
    vector<int *> lol; 

    int a1 = 1; 
    int a2 = 2; 
    int a3 = 3; 

    int * a = &a1; 
    int * b = &a2; 
    int * c = &a3; 

    lol.push_back(a); 
    lol.push_back(b);  
    lol.push_back(c); 

    cout << *lol[1] << endl; 
} 
0

Первая проблема заключается в объявлении указателей

  int* a, b, c; 

Это создаст как указатель и b & c as внутр.

Использование декларации как

  int* a,*b,*c; 

И при обращении к элементам вектора использования .at() метод вектора.

  cout << *lol.at(0) << endl; 
Смежные вопросы