2013-06-29 105 views
1
#include <iostream> 
using namespace std; 

int main() 
{ 
    int **a; 
    int b[5] = {3,4,5,6,1}; 
    *a=b; 
    cout << *((*a)+0) << endl; 
    return 0; 
} 

根據我的理解,*((*a)+0)相當於(*a)[0]。我錯了嗎?我怎樣才能讓上面的代碼打印數組的第一個元素?爲什麼我的代碼會產生分段錯誤?

爲什麼這個的代碼工作?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int *a; 
    int b[5] = {3,4,5,6,1}; 
    a=b; 
    cout << *(a+0) << endl; 
    return 0; 
} 

當我更換a*a無處不在,爲什麼錯了?

+0

您沒有爲'a'分配任何內存。 – Musa

+2

您將指向int *的*指針賦值給作爲指向int指針的'a'的'a'。所以你必須將* pointer *的內存分配給'int指針'。 – Nawaz

+0

這樣看待:'int * a'可以看作'(no_adr_ptr)a',當你做'a = b'時它會變成'(adr_of_b)a'; 'int ** a'變成'(no_adr_ptr(no_adr_ptr)a)',當你做'* a = b'時變成'(no_adr_ptr(adr_of_b)a)'。 hth – slashmais

回答

11

您在

*a=b; 

訪問未初始化的指針此時a點到一個隨機位置,且與不確定的行爲規則你無法預知會發生什麼。對你來說,它似乎是一個你不能寫信的位置,所以你會崩潰。


第二個變量的工作,因爲你做ab,你不寫一個未初始化的指針,你實際上初始化指針與第一項的b位置。

+0

謝謝。你可以給我一個在線參考,我可以完全閱讀和理解嗎? – Alex

+0

@亞歷克斯對不起,但不幸的是我不知道任何好的指針教程。 –

+3

Stroustrup。第1至1600頁左右。 – AlexK

相關問題