日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C語言結(jié)構體用法很多,坑也很多

C語言可謂是編程界的傳奇語言,歷經(jīng)幾十年,依然排名前列。

本文主要說的是C語言中的結(jié)構體,結(jié)構體是C語言中重要的一部分內(nèi)容,也是C語言中常用的一種數(shù)據(jù)結(jié)構。

一、關于結(jié)構體

在C語言中,結(jié)構體(struct)指的是一種數(shù)據(jù)結(jié)構,是C語言中復合數(shù)據(jù)類型(aggregate data type)的一類。

結(jié)構體可以被聲明為變量、指針或數(shù)組等,用以實現(xiàn)較復雜的數(shù)據(jù)結(jié)構。結(jié)構體同時也是一些元素的集合,這些元素稱為結(jié)構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。

結(jié)構體的定義如下所示:

 
 
 
 
  1. struct tag { member-list } variable-list; 

其中:

  • struct為結(jié)構體關鍵字;
  • tag為結(jié)構體的標志;
  • member-list為結(jié)構體成員列表,其必須列出其所有成員;
  • variable-list為此結(jié)構體聲明的變量。

在一般情況下:tag、member-list、variable-list這3部分至少要出現(xiàn)2個。

二、結(jié)構體常規(guī)定義

不同的定義,應用在不同場景,所以,我們編程時需要結(jié)合實際情況來定義結(jié)構體。

方法1:

定義結(jié)構體stu,此時結(jié)構體相當于一個類型,比如int,如需使用此結(jié)構體,方法同int.

 
 
 
 
  1. struct stu
  2. {
  3.     char  aa;
  4.     short bb;
  5.     int   cc;
  6. };
  7. struct stu stu1, stu2;

方法2:

定義結(jié)構體stu同時定義需要使用的結(jié)構體變量stu1, stu2。如后面再需要定義結(jié)構體變量,方法同1.

 
 
 
 
  1. struct stu
  2. {
  3.     char  aa;
  4.     short bb;
  5.     int   cc;
  6. }stu1, stu2;
  7. struct stu stu3;

方法3:

定義結(jié)構體時,結(jié)構體名稱缺省,同時定義結(jié)構體變量stu1,stu2。但后面不可再定義結(jié)構體變量。

 
 
 
 
  1. struct
  2. {
  3.     char  aa;
  4.     short bb;
  5.     int   cc;
  6. }stu1, stu2;

提示:

這里不能像上面再定義結(jié)構體變量:(以下錯誤)

 
 
 
 
  1. struct stu3; 
  2. struct stu stu3;

三、使用typedef定義結(jié)構體

這里先簡單說下typedef。

在C和C++編程語言中,typedef是一個關鍵字。它用來對一個數(shù)據(jù)類型取一個別名,目的是為了使源代碼更易于閱讀和理解。它通常用于簡化聲明復雜的類型組成的結(jié)構 ,但它也常常在各種長度的整數(shù)數(shù)據(jù)類型中看到,例如size_t和time_t。

維基百科

方法4:

使用typedef定義結(jié)構體同時,給stu結(jié)構體別名STU,后續(xù)定義可不用使用struct stu,直接使用STU即可。

 
 
 
 
  1. typedef struct stu
  2. {
  3.     char  aa;
  4.     short bb;
  5.     int   cc;
  6. }STU;
  7. STU stu1;

你會發(fā)現(xiàn),其實就是通過關鍵字typedef,將STU取代了struct stu。

當然,也可以這么用:

 
 
 
 
  1. struct stu stu1;

上面這種定義就失去了typedef的意思,所以不推薦。

方法5:

使用typedef定義結(jié)構體時,省掉結(jié)構體第一個別名stu,直接在后面加STU,使用方法同上。

 
 
 
 
  1. typedef struct
  2. {
  3.     char  aa;
  4.     short bb;
  5.     int   cc;
  6. }STU;
  7. STU stu1;

方法6:

還有一種符合語法規(guī)則,但意義不大的定義方式。

 
 
 
 
  1. typedef struct stu
  2. {
  3.     char  aa;
  4.     short bb;
  5.     int   cc;
  6. };
  7. struct stu stu1;

以上這些定義方式算是語法的知識,如果還不懂,請再次復習一下。

四、結(jié)構體大小計算

結(jié)構體的大小,我相信很多人都沒搞明白。實際編程中也是很多地方都在應用,比如:存儲、拷貝結(jié)構體時都會牽涉到結(jié)構體大小的問題。

1. 對比兩結(jié)構體大小,一樣嗎?

結(jié)構體1:

 
 
 
 
  1. struct stu
  2. {
  3.     char  aa;
  4.     short bb;
  5.     char  cc;
  6. }stu1;

結(jié)構體2:

 
 
 
 
  1. struct stu
  2. {
  3.     char  aa;
  4.     char  bb;
  5.     short cc;
  6. }stu2;

答案是不一樣。程序測試得出sizeof(stu1)=6, sizeof(stu2)=4.

2. 分析不一樣原因

結(jié)構體計算要遵循字節(jié)對齊原則,一般滿足三個準則:

  • 結(jié)構體變量的首地址能夠被其最寬基本類型成員的大小所整除;
  • 結(jié)構體每個成員相對于結(jié)構體首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要編譯器會在成員之間加上填充字節(jié);
  • 結(jié)構體的總大小為結(jié)構體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會在最末一個成員之后加上填充字節(jié);

對于上面結(jié)構體stu1來說,最大字節(jié):2字節(jié),順序是 char->short->char:

對于上面結(jié)構體stu2來說,最大字節(jié):2字節(jié),順序是 char->char->short:

通過上面兩個表格,相信你應該明白了,改成4字節(jié)的int,原理一樣。

最后,強調(diào)一下,學習編程,不能只看書,要多敲代碼。


分享題目:C語言結(jié)構體用法很多,坑也很多
網(wǎng)頁鏈接:http://www.5511xx.com/article/cohoohg.html