[英]What's the meaning of "++" after a union in C?
這是代碼
int AreSymEquivalent_hkl(const T_SgInfo *SgInfo, int h1, int k1, int l1,
int h2, int k2, int l2)
{
int iList, mh2, mk2, ml2, hm, km, lm;
T_RTMx *lsmx;
mh2 = -h2;
mk2 = -k2;
ml2 = -l2;
/* check list of symmetry operations */
lsmx = SgInfo->ListSeitzMx;
for (iList = 0; iList < SgInfo->nList; iList++, lsmx++)
{
hm = lsmx->s.R[0] * h1 + lsmx->s.R[3] * k1 + lsmx->s.R[6] * l1;
km = lsmx->s.R[1] * h1 + lsmx->s.R[4] * k1 + lsmx->s.R[7] * l1;
lm = lsmx->s.R[2] * h1 + lsmx->s.R[5] * k1 + lsmx->s.R[8] * l1;
if ( h2 == hm && k2 == km && l2 == lm)
return (iList + 1);
else if (mh2 == hm && mk2 == km && ml2 == lm)
return -(iList + 1);
}
return 0;
}
它是由計算晶體學領域非常著名的包“sginfo”定義的函數。 (如果你願意,你可以從這里下載: https : //github.com/rwgk/sginfo/tree/master/sginfo_1_01 )所以我確定它沒有錯誤。 問題在行中
lsmx = SgInfo->ListSeitzMx;
for (iList = 0; iList < SgInfo->nList; iList++, lsmx++)
其中“SgInfo”是一個大結構,我沒有把它放在這里,包含“ListSeitzMx”——一個名為“T_RTMx”的聯合的屬性,它包含一些矩陣信息。 定義如下:
typedef union
{
struct { int R[9], T[3]; } s;
int a[12];
}
T_RTMx;
這就是讓我困惑的部分,在聯合之后是“++”。 我所知道的是,“++”之前的 int 值加到 1,但聯合類型沒有意義。 或者我在整件事上犯了一個大錯誤? 那個“lsmx”不是聯合或其他東西......作為C的初學者,我試圖針對這個問題編寫一個小測試腳本,但錯誤讓我發瘋。 所以我終於決定發布這個問題......
lsmx++
相當於
( orig = lsmx, lsmx = lsmx + 1, orig )
換句話說,
lsmx++
向lsmx
添加一個(就像你已經完成了一樣( lsmx = lsmx + 1
)。
lsmx++
計算結果為原始值lsmx
,但那是在你的代碼丟棄。
lsmx
是一個指針。 給指針加1
會增加指向對象的大小( sizeof(*lsmx)
)的地址。
例如,
T_RTMx foo[5] = ...;
T_RTMx *lsmx = foo; # Same as &( foo[0] ) # Points to foo[0]
lsmx++; # Points to foo[1]
lsmx += 2; # Points to foo[3]
請記住, a[b]
完全等同於*(a+b)
。
你實際上並沒有加入工會。 您正在添加地址。
考慮一個類似的情況:
struct abc {
int a, b, c;
//Lots more nonsense
};
現在,
struct abc z;
struct abc *a;
a = &z
這表明a
存儲struct abc
類型的地址。
現在讓我們修改指針的工作方式。
假設z
位於位置1000
。 a
存儲該值。 當我做*a
,我指的是內存位置1000
到sizeof(struct abc)
。 由於a
是指向struct abc
類型的指針,您可以執行以下操作:
a->c = 2;
或類似的東西。
當你說:
int *b;
它實際上可以存儲任何其他類型的地址。 如果你真的喜歡冒險,你可以這樣做:
b = &z;
您可能會或可能不會收到警告,具體取決於您的編譯器。
當我存儲&z
,編譯器所做的唯一一件事就是將z
的地址處的z
視為int
。 所以b
的值為1000
。
現在當你做*b
,你指的是地址1000
到sizeof(int)
。
總結到這,
b++;
這只會做1000 + sizeof(int)
,然后到達下一個int
。
a++;
會做1000 + sizeof(struct abc)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.