2013-12-23 44 views
-1
# include <stdio.h> 
# include <stdlib.h> 
int main(int argc, char *argv[]) 
{ 
int a[5][10][2]; 
int *p; 
p = (int(*)[10][2])p;//Gives error! 
return EXIT_SUCCESS; 
} 

我想強制類型轉換p來輸入,以便它可以作爲一個指針給定的3-d陣列行動?有沒有辦法做到so.I上午applyindg變量的類型是變量名稱以外的所有內容。用C類型轉換指向一個多維數組

回答

3

你爲什麼試圖「強調」任何東西?爲什麼你會期望(int(*)[10][2])與「int *」指針兼容的「typecasted」值?爲什麼你的原始代碼分配pp,完全忽略a

這是你可以做什麼

int a[5][10][2]; 
int (*p)[10][2] = a; 

現在p是可以用來訪問a指針,即p[i][j][k]相當於a[i][j][k]。沒有必要的類型轉換。

+0

「你爲什麼會期望一個值」intpected「到(int(*)[10] [2])可以放入一個int *指針?」爲什麼不呢?它們都不會有相同的大小? – user2688772

+1

@ user2688772:語言不關心「大小」。 「大小不重要。重要的是語言規範中描述的類型兼容性規則。這些規則說'int(*)[10] [2]'和'int *'是兩個完全不同的,不兼容的指針類型。 – AnT

+0

尺寸似乎搞砸了;不應該是'int(*)[5] [10]'?我不是100%確定的。 – anatolyg

0

如果你寫p =(int(*)[10] [2])a;它不會給你任何錯誤,可能是一個警告。你在考慮將p轉換爲指向3-D數組的指針,這是錯誤的。分配一個p後嘗試執行此語句。

printf("addresses %u %u",p,p+1); 

根據你的輸出應該與此類似(可以說)「地址9990000 99940000」,因爲你在想p是指向3-d陣列。但是,您會得到類似於「地址9990000 9990004」的結果,證明p是指向整數的指針。