2016-05-07 38 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中存儲(並稍後復活)一個指針。這在某些機器上完全不起作用(例如,intint*具有不同尺寸的機器)。你絕不應該在C++中使用C風格的(foo)bar強制轉換。您可以簡單地將指針存儲在另一個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。有些人仍然使用這個邊緣案例作爲他們提出正確排列星號的唯一理由(是的,我知道這符合語法,但這就是關於它!),這使坦率地使思想暴躁起來。在實際使用中,有很多好的理由讓'*'成爲「類型的一部分」。嘿,嘿。 –