作為資料給出這3個:
float pin[5];
float mat[2][4];
float* ptrf;
我必須檢查以下陳述是否正確:
ptrf = *mat; // I think its is correct
*(mat 2) = pin[2]; // I think its false
*(mat[0]) = pin[0]; // I am not sure
ptrf = mat[1]; // I think its correct
我正在努力理解指標如何與矩陣一起作業,但這真的很令人困惑。如果有人愿意解釋,我將不勝感激!
uj5u.com熱心網友回復:
首先,float ptrf*
在語法上無效。我認為它應該是float *ptrf;
(ptrf
是指向的指標float
)。
鑒于宣告:
float pin[5];
float mat[2][4];
float *ptrf;
在陳述句中,由(型別)指定ptrf = pin;
的值(實際上是左值)被轉換為指向陣列初始元素的指向。一切都是正確的。指向。pin
float[5]
float*
ptrf
pin[0]
在陳述句中,由(型別)ptrf = *mat;
指定的左值被轉換為指向外部陣列初始元素的指向。(元素本身是一個型別陣列。指向的型別在語法上寫為。)一元運算符取消參考該指標,產生一個型別的左值,該左值是外部陣列的初始行。該型別的左值被轉換為指向陣列初始元素的指向。一切都是正確的。指向。mat
float[2][4]
float(*)[4]
float[4]
float[4]
float(*)[4]
*
float[4]
float[4]
float*
ptrf
mat[0][0]
在陳述句中, (型別)*(mat 2) = pin[2];
指定的左值被轉換為指向外部陣列初始元素的a。指向外部陣列的元素索引 2。這剛剛超過陣列的末尾。指向陣列的最后一個元素是可以的,但不能訪問那里的元素。正在取消參考那個不存在的元素,所以不行。此外,賦值左側不允許有型別和陣列,因為它們在轉換為指向其初始元素的指標后不再是左值。此外,賦值的右側有 type ,這與左側不兼容。mat
float[2][4]
float(*)[4]
mat 2
*(mat 2)
*(mat 2)
float[4]
float
在陳述句中*(mat[0]) = pin[0];
,mat[0]
是外部陣列的第一個元素并且具有型別float[4]
。這將轉換為float*
指向其初始元素的 a 。一元運算*
符取消參考指向型別左值的指標float
。賦值的右側pin[0]
也有 type float
。一切都是正確的。請注意,*(mat[0])
它等價于mat[0][0]
,并且應該很明顯這mat[0][0] = pin[0];
是正確的。
對于陳述句ptrf = mat[1];
,記住那ptrf = *mat;
是正確的,并注意那ptrf = *mat;
是等價于ptrf = mat[0];
。唯一的區別ptrf = mat[1];
是ptrf
它將指向矩陣第 1 行的初始元素,而不是指向第 0 行的初始元素。矩陣有 2 行,因此可以指向第 1 行的初始元素(并且它也可以指向不存在的第 2 行的初始元素,只要該行的內容未被訪問)。一切都是正確的。ptrf
指向mat[1][0]
。
uj5u.com熱心網友回復:
第一的:
ptrf = *mat;
*mat
mat[0]
與1)相同
*mat -> *(mat 0) -> mat[0]
所以,該陳述句也可以寫成
ptrf = mat[0];
mat[0]
是陣列的第1D
一個2D
陣列mat[2][4]
。當你訪問一個陣列時,它被轉換為一個指向第一個元素的指標(這個規則很少有例外)。
因此,mat[0]
將轉換為指向mat[0]
陣列第一個元素的指標,即&mat[0][0]
其型別為float *
,并將分配給指標ptrf
。
第二:
*(mat 2) = pin[2];
*(mat 2)
相當于mat[2]
1)。的型別mat[2]
是浮點值float [4]
陣列。
在 C 中,陣列名稱是不可修改的左值。您不能將任何內容分配給陣列,而只能初始化/修改陣列成員。該宣告違反了語言限制,因此,這是無效的。任何符合語言標準的編譯器都會在此陳述句上拋出錯誤訊息。4
2D
您還應該注意的一件事是陣列的第一維的有效值mat
是0
and 1
。嘗試使用任何其他值作為mat
陣列的第一維(例如mat[2]
)將導致 UB。
第三:
*(mat[0]) = pin[0];
*(mat[0])
相當于mat[0][0]
1)
*(mat[0]) -> *((mat[0]) 0) -> mat[0][0]
這意味著,它是 array 的第一個成員mat[2][4]
。mat[0][0]
is的型別float
和的型別pin[0]
也是float
。這將最終分配pin[0]
to的值mat[0][0]
。
第四:
ptrf = mat[1];
這與第一個陳述句相同,唯一的區別是在這里它是mat[1]
和在第一個陳述句中它是mat[0]
。這將最終將mat[1]
陣列(即&mat[1][0]
)的第一個元素的地址分配給指標ptrf
。
1)。C 標準#6.5.2.1
下標運算子 [] 的定義是 E1[E2] 等同于 (*((E1) (E2)))..
uj5u.com熱心網友回復:
好的,畢竟答案是正確,錯誤,正確,正確并且檢查陳述句是否有效的方法是將它們編譯到 .c 檔案中
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/508400.html
上一篇:陣列中值的地址不是靜態C#
下一篇:如何使用在python中回傳二維陣列(矩陣)的C函式(并進行一些計算機繁重的計算)從python復制二維陣列(矩陣)?