C語言結(jié)構(gòu)體

結(jié)構(gòu)是一個或多個變量的集合,這些變量可能是不同的類型,為了處理的方便而將這些變量組織在一個名字之下。

結(jié)構(gòu)體基礎(chǔ)

一個簡單的結(jié)構(gòu)聲明如下:

struct point {
   int x;
   int y;
};
struct point p1, p2; //結(jié)構(gòu)體變量聲明,

可以通過p1.x, p1.y等引用成員。

結(jié)構(gòu)與函數(shù)

當(dāng)結(jié)構(gòu)體參數(shù)作為函數(shù)參數(shù)時,是值傳遞。比如下面的函數(shù)并不能讓p1的成員增加1,實際上addone函數(shù)沒有任何作用。

void addone(struct point p)
{
   p.x ++;
   p.y ++;
}
struct point p1 = {100, 200};
addone(p1);

一個改進是通過返回值,比如:

struct point addone(struct point p)
{
   p.x ++;
   p.y ++;
   return p;
}
struct point p1 = {100, 200};
p1 = addone(p1);
#include <stdio.h> 

struct point{
   int x;
   int y;
};

void addone_01(struct point p)
{
   // 錯誤的實現(xiàn),因為結(jié)構(gòu)體作為參數(shù)是值傳遞
   p.x ++; 
   p.y ++; 
}

struct point addone_02(struct point p)
{
   //實現(xiàn)正確,但是糟糕的設(shè)計
   p.x ++; 
   p.y ++; 
   return p;
}

void addone(struct point *pp)
{
   // 實現(xiàn)正確,推薦設(shè)計,使用指針避免分配結(jié)構(gòu)空間
   (*pp).x ++; 
   (*pp).y ++; 
}

void printptr(struct point *pp)
{
   printf("x = %d \n", pp->x);
   printf("y = %d \n", pp->y);
   printf("\n");
}

int main()
{
   struct point p = {100, 200};
   printptr(&p);

   addone_01(p); 
   printptr(&p);
  
   p = addone_02(p); 
   printptr(&p);
        
   addone(&p); 
   printptr(&p);

   return 0;
}

當(dāng)傳遞給函數(shù)的結(jié)構(gòu)很大時,推薦使用指針方式,效率更高,不會分配額外的空間。

另一個例子:

#include <stdio.h>

struct point{
   int *p1;
   int *p2;
};

void printptr(struct point *pp)
{
   printf("%d, %d\n\n", *(pp->p1), *(pp->p2));
   return;
}

int main()
{
   int a1 = 12;
   int a2 = 13;

   int b1 = 22;
   int b2 = 23;

   struct point pa;
   pa.p1 = &a1;
   pa.p2 = &a2;
   printptr(&pa);

   struct point pb;
   pb.p1 = &b1;
   pb.p2 = &b2;
   printptr(&pb);

   pa = pb;
   printptr(&pa);
   printptr(&pb);

   (*(pa.p1)) ++;
   printptr(&pa);
   printptr(&pb);

   return 0;
}

output:

12, 13

22, 23

22, 23

22, 23

23, 23

23, 23

可見,當(dāng)pa=pb時,它們內(nèi)部的指針變量也指向相同的地址。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,615評論 3 44
  • 謹記 什么是價值?或許沒有多少人能夠明白,其實價值并不是實際存在的,它應(yīng)該是一種體現(xiàn),比如為城市點綴最美好的一面而...
    長風(fēng)留言閱讀 2,661評論 0 15
  • 結(jié)構(gòu)體(struct)指的是一種數(shù)據(jù)結(jié)構(gòu),是C語言中聚合數(shù)據(jù)類型(aggregate data type)的一類。...
    超級小江閱讀 2,529評論 0 7
  • 結(jié)構(gòu)體: 1,基本定義: 成員列表:有基本數(shù)據(jù)類型定義的變量或者構(gòu)造類型的變量example: struct st...
    酸菜牛肉閱讀 1,653評論 0 0
  • 這是什么行業(yè)?這個行業(yè),潛臺詞,直銷。進入中國的前三年,美麗的誤會,糟糕的誤會。直銷人進入,直銷人退出。百度,產(chǎn)品...
    穎覺醒閱讀 140評論 0 0

友情鏈接更多精彩內(nèi)容