2013-06-22 513 views
2

Does(int *)arr [2]是否必須使用類型轉換?如果是,它在哪裏使用?(int *)arr [2]和int * arr [2]之間的區別是什麼?

這個問題出現了,當我試圖編譯follwing代碼:通過更換

int* arr[2] with (int*)arr[2] 

感謝

int* arr[2]; 
    int arr1[] = { 1,2}; 
    int arr2[] = { 1,6}; 
    arr[0] = arr1; 
    arr[1] = arr2; 

+7

是的,'(int *)arr [2];'是一個強制轉換表達式,將'arr [2]'強制轉換爲'int *'。但是'arr'可能沒有被聲明,編譯器barfs。 –

+0

在聲明上進行類型轉換?我認爲這是一個指向int數組的指針.. –

+7

@LewsTherin這將是'int(* arr)[2];'。用括號表示,這不是一個聲明。這只是一個沒有效果的表達式(除了'arr'還沒有被聲明的事實之外)。 –

回答

3

第一個使arr成爲指向int的指針數組。所以你的arr是一個變量。這是一條宣言線。

第二個:假設arr是一個陣列(其是allready聲明!),需要其爲arr[2]並在其上蒙上了pointer to int類型的值。

2

在您的上下文中將int *arr[2]替換爲(int *) arr[2]的問題是,後者不再符合C語法的聲明。根據C語法的結構,在int *arr[2]*附加到arr而不是int。通過使用額外的()將其強制轉向int違反了聲明的後綴。

只要不違反C語法強加的聲明的語法結構,就允許在C聲明中使用()。例如,你可以做

int *(arr)[2]; // same as `int *arr[2]` 

int *(arr[2]); // same as `int *arr[2]` 

int (*arr)[2]; // different from `int *arr[2]`, but still valid 

但不是你的(int *) arr[2](int) *arr[2]。後者不是聲明。

相關問題