2016-05-07 3 views
-2

Я потратил время на изучение программирования примерно неделю или две назад, и я сделал простую функцию с динамическим распределением памяти. Он отлично работает (я думаю ... ничего не разбилось), но мне интересно, есть ли другой способ вернуться к началу массива вместо сохранения его адреса в другой переменной.Возвращающий указатель на начало массива

void time() 
{ 
    int* tab, b; 
    int q, i; 
    clock_t start, stop; //time.h cstdlib 
    double time; 


    cout << "Number of elements in array: "; 
    cin >> q; 
    tab = new int[q]; 
    b = (int) tab; 
    start = clock(); 
    for (i = 0; i < q; i++) 
    { 
     tab[i] = i; 
     tab[i] += 50; 
    } 
    stop = clock(); 
    czas = (double)(stop - start)/CLOCKS_PER_SEC; 
    cout << "Time: "<< time << endl; 
    tab = (int*) b; 
    delete [] tab; 
} 

ответ

2

Это:

b = (int) tab; 

является незаконным. Вы сохраняете (и позже воскрешаете) указатель в int. Это не будет работать вообще на некоторых машинах (например, где int и int* имеют разные размеры). Вы никогда не должны использовать C-style (foo)bar отливки на C++. Вы можете просто сохранить указатель в другом указателе int*. Но в вашем примере программы вам не нужно хранить его вообще, потому что вы никогда не меняете адрес внутри исходного указателя.

Если бы я переписать свой код, я бы это сделать:

void time() 
{ 
    int q; 
    cout << "Number of elements in array: "; 
    cin >> q; 

    vector<int> tab(q); 
    clock_t start = clock(); 
    for (int i = 0; i < q; i++) 
    { 
     tab[i] = i; 
     tab[i] += 50; 
    } 
    clock_t stop = clock(); 
    double time = double(stop - start)/CLOCKS_PER_SEC; 
    cout << "Time: "<< time << endl; 
} 

выше делает почти то же самое, но проще и безопаснее.

3

Нет, нет способа взять указатель и вернуться к его «базовому адресу». Есть несколько разных моделей, которые вы могли бы использовать и трюки, но они редко стоят того.

Кстати, в C++ * является «частью имени» вместо «части типа» в декларации. Это означает, что int* tab, b похож на int (*tab), b, и только tab является указателем. Вот почему вам нужно отправить tab в int прямо сейчас, когда вы назначили его b. Вы должны либо сделать int* tab, * b, либо объявить их отдельно в разных строках.

+0

Да, разные линии ftw. Некоторые люди по-прежнему используют этот случай с одним краем в качестве единственного оправдания для предложения правильного выравнивания звездочек (да, я знаю, что соответствует грамматике, но это все!), Который откровенно пугает ум. Есть много веских причин постоянно думать о '*' как о «части типа» в реальном использовании. Хей-хо. –

Смежные вопросы