簡體   English   中英

C中聯合后的“++”是什么意思?

[英]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 ,我指的是內存位置1000sizeof(struct abc) 由於a是指向struct abc類型的指針,您可以執行以下操作:

a->c = 2;

或類似的東西。

當你說:

int *b;

它實際上可以存儲任何其他類型的地址。 如果你真的喜歡冒險,你可以這樣做:

b = &z;

您可能會或可能不會收到警告,具體取決於您的編譯器。

當我存儲&z ,編譯器所做的唯一一件事就是將z的地址處的z視為int 所以b的值為1000

現在當你做*b ,你指的是地址1000sizeof(int)

總結到這,

b++;

這只會做1000 + sizeof(int) ,然后到達下一個int

a++;

會做1000 + sizeof(struct abc)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM