我有 3 行代碼,它們的性能完全相同但語法不同,基本代碼是:
int a, b;
printf("Enter the size of your array [a][b]: ");
scanf("%d %d", &a, &b);
int arr[a][b];
int *pa;
pa = (int *)&arr;
for (i = 0; i < a*b; i )
{
printf("[%d] [%d] = ", i/b, i%b);
scanf("%d", (pa i));
}
在行上pa = (int *)&arr;,我可以將該行切換到(int *)array, (int *)&array, 并且&array沒有遇到任何問題,只在最后一個遇到警告。我想知道正確的語法是以及所有 3 者之間的區別。
uj5u.com熱心網友回復:
兩個關鍵資訊:
- 陣列的地址是它的第一個元素的地址。
- 當作為指標處理時,陣列降級為指向其第一個元素的指標
所以,
-
pa = arr;相當于
pa = &(arr[0]); // Type mismatch: RHS is int (*)[b]在執行
pa = (int *)arr;. -
pa = &arr;相當于
pa = &(arr[0]); // Type mismatch: RHS is int (*)[b]在執行
pa = (int *)&arr;.
根據規范,我不確定型別轉換是否安全。如果您想將其視為一維int值陣列,最好也以這種方式宣告它。
uj5u.com熱心網友回復:
正確的語法是
pa = arr;,如果您發現自己需要添加演員表,那么您就做錯了。坦率地說,如果您是初學者,則永遠不應該使用指標。pa = (int *)array只是一個多余的演員表,什么也沒有,因為array在這個運算式中使用時已經“腐爛”成int*.pa = &arr不“只給出警告”,它是無效的 C。這是所謂的約束違規 - 不兼容的指標型別的無效分配。請研究學習 C 的初學者推薦哪些編譯器選項?和什么是必須的時候發現錯誤,C編譯器嗎?同樣,
pa = (int *)&array是不兼容型別之間的無效指標轉換。它將編譯但具有特定于編譯器的結果。嚴格來說,這是不正確的代碼,但可能適用于特定的編譯器和系統。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/364672.html
