2015-10-15 179 views
-1

[編輯]現在我的代碼運行良好。但有人可以解釋爲什麼a通過b = a而不是b = & a?我以爲我必須讓b指向使用&的地址。謝謝。C++指針和數組(複製功能)

代碼:

#include <iostream> 
using namespace std; 
void myf(double a[]); 

int main() 
{ 

double a[]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8}; 


myf(a); 


system("pause"); 
return 1; 
    } 

void myf(double a[]) 
{ 
    double * b; 
    b = a; 


     cout << "This is a : " << a[0] << " " << a[1] <<" " << a[2] <<" " << a[3] <<" " << a[4] <<" " << a[5] <<" " << a[6] <<" " << a[7] << endl; 
     cout << "This is b : " << b[0] <<" " << b[1] <<" " << b[2] <<" " << b[3] << " " <<b[4] <<" " << b[5] <<" " << b[6] <<" " << b[7] << endl; 


} 
+0

你可以發佈你得到什麼樣的錯誤? –

+1

您的函數被聲明爲參數指向雙精度的指針,但您嘗試使用指向數組的指針調用該函數。就像撥打壽司送貨來解決寬帶問題一樣,您只會遇到困惑。 –

+0

將myf(&a,&b);''改爲'myf(a,b);'。附加註釋...'* b = * a'只會分配a的第一個元素到b(不會將數組'a'複製到array'b')。'cout'也一樣(只有第一個元素會被打印出來) – knightrider

回答

0
void myf(double *a, double *b) 

期待雙指針,或(雙*)。

myf(&a,&b); 

正在傳遞雙指針指針或(double **)。

這就是爲什麼它不編譯。

關於功能,你需要澄清一下:你想讓數組b指向數組a?或者你想將數組a的內容複製到數組b中?這些不是同一回事,而且語義非常不同。

編輯:

爲響應OP的評論,有什麼需要做的是,myf需要重新聲明:

void myf(double *a, double **b) 
{ 

    *b=a; 
    //Other debug stuff 
} 

OR:

void myf(double *a, double *&b) 
{ 

    b=a; 
    //Other debug stuff 
} 

兩者在功能上等同,但作爲一個良好的做法,通常希望你使用第一種形式。

但是,在重寫代碼時需要考慮一些其他內容。例如:

int main() 
{ 

    double a[]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8}; 
    double b[8]; 

    myf(a,&b); 


    system("pause"); 
    return 1; 
} 

這會產生不好的,可能是段錯誤的錯誤。即使你的編譯器讓它發生(它不應該),你可能不想這樣寫。相反,這樣寫:

int main() 
{ 

    double a[]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8}; 
    double * b; 

    myf(a,&b); 

    system("pause"); 
    return 1; 
} 
+0

謝謝。我希望數組b使用函數指向數組a。 –

+1

不,'&a'和'&b'是指向數組的指針('double(*)[8]';它甚至在錯誤消息中表示),而不是指向指針的指針。 – molbdnilo

+0

謝謝你的幫助,我更新了代碼,使它簡單得多,但它仍然無法編譯。 –

0

指針需要一段時間才能直行,不用擔心。

在myf中,指針指向單個double,因此賦值語句只能複製'a'指向'b'指向的位置的內容。

當我剛開始的時候,我發現在圖形論文中把內存當作塊是很有用的。在方格紙上對每個「位置」進行編號。現在紙質世界中的指針和變量名稱是什麼?

0
#include <iostream> 
using namespace std; 
void myf(double *a, double *b, int len); 

int main() 
{ 

    double a[] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8}; 
    double b[8]; 

    myf(a, b, 8); 


    system("pause"); 
    return 1; 
} 

void myf(double *a, double *b, int len) 
{ 

    for(int i = 0; i < len; i++) 
     b[i] = a[i]; 

    cout << "This is a : "; 
    for(int i = 0; i < len; i++) 
     cout << *a; 
    cout << endl; 

    cout << "This is b : "; 
    for(int i = 0; i < len; i++) 
     cout << *b; 
    cout << endl; 


} 
+0

建議解釋你做了什麼以及你爲什麼做了。僅有代碼的答案通常並不僅僅只是剪切和粘貼。 – user4581301

1

b由於是一個數組,&b是指向的數組,即double (*)[8]。然而你的函數需要一個指向double的指針,而不是指向double[8]的指針。

爲了解決這個問題,你可以使用array-to-pointer decay

myf(a, b); 

編譯器看到的是myf需要double*和你傳遞一個double陣列。然後它會隱式地將該數組轉換爲指向該數組中第一個元素的指針。

順便說一下你的代碼有未定義的行爲,因爲b在第一次使用之前還沒有被初始化。