亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言中結構體struct編寫的一些要點解析

2020-01-26 14:38:41
字體:
來源:轉載
供稿:網友

一、關于結構體的聲明
1、匿名聲明。如:

struct {  int i,j;}point;

說明:
這段代碼的含義是,聲明一個無名(anonymous)的結構體,并創建了一個結構體變量point。如果這段聲明是放在全局域(在任意函數(比如main函數)外)內,那么point內的變量將被初始化為默認值,換句話說,以這種方式聲明結構體變量時就已經為它分配了內存空間。
適用于該結構體只需要產生一個變量!本例中,該匿名結構體將有且僅有point這個結構體變量!
不同的匿名結構體變量,類型是不同的!如

struct {  int i,j;}p1,p2;struct {  int i,j;}p3;

如果將 p1=p2 ,則ok;如果將 p1=p3 ,則編譯器提示"incompatible types when assigning to type ‘struct <anonymous>' from type ‘struct <anonymous>'",兩者的實際類型是不一樣的。

2、顯式聲明一個結構體

struct node{  int i,j;};

聲明了一個結構體 struct node,如果需要聲明一個它的對象,則可以這樣:struct node n1;
可以聲明多個該結構體的變量。
區別"C中的結構體變量" 和 "Java中的類對象"。C中,"struct node n1;"創建了一個結構體變量,并為它分配了內存空間,不一定初始化!得看這個變量是否在全局域;而Java中,"Node n1;"只是聲明了一個類對象,也就是說是一個"空引用",可以想象成C中的空指針,當"n1 = new Node();"時,n1才指向了該對象的內存空間。因此,在Java中,可以通過"n1==null"來判斷對象是否為空;在C中,不能通過"n1==NULL"來判斷,因為"n1"并不是一個指針,而是一個類型變量的名字,就像"int a;"這種,顯然"a"不是指針!

3、用typedef來簡化結構體的寫法

typedefstruct {  int i,j;}Node;

相當于把代碼改名為Node了。以前需要這樣聲明"struct node n1;",現在只需要"Node n1;"。
這段代碼中,如果沒有typedef,代碼的意思是"聲明了一個匿名結構體變量"!注意區別。
4、在結構體中聲明結構體變量。

typedef struct {  int i,j;  Node n1;}Node;

這段代碼是錯誤的!
錯誤1:直接在結構體中聲明另外一個結構體,會出現死循環,如A包括B,B又包括A,A又包括B……使得編譯器無法知道結構體的空間大小,因此,無法通過編譯!
錯誤2:typedef還沒有將結構體命名為Node,你就在結構體中使用了Node,顯然,編譯器此時還不知到Node是什么!所以,無法通過編譯!
正確的使用方法如下:

typedef struct node{  int i,j;  struct node *n1;}Node;

二、關于結構體的賦值
1、聲明一個變量后的默認值

typedef struct {  char *p;  int i;  char ch[256];}mystr;mystr str;//聲明一個變量,此時已為之分配了空間!

如前面提到的,如果這個變量聲明是在全局,則"str.p等于NULL,str.i等于0,str.ch數組都是'/0'",為默認初始值;如果不在全局,則所有值都是"野值"。

2、手動初始化

mystr str2={"abc",2,"def"};mystr str3={.p="abc",.ch="def"};mystr str4={.ch[256]="def"};//error!mystr str5={.ch[10]="def"};//right!

此時,str2聲明時手動賦了初值。str2.p和str2.ch賦值時的行為是不一樣的!str2.p是一個字符指針,也就是將p指向常量字符串"abc"在內存中的地址;而str2.ch是一個常量字符指針(無法操作指針),代表的是字符數組,也就是將常量字符串"def"逐字符copy到ch數組里,賦值結束后,ch的值是:'d','e','f','/0','/0'……
也可以像str3這樣初始化結構體中的某些變量,值得注意的是str4和str5。對于數組(如 char a[size])來說,傳遞給常量字符指針,可以是"a",可以是"a[n]"(0<=n<size,編譯器會忽略掉n),不能是"a[size]"(編譯器會檢測,報"array index in initializer exceeds array bounds")。

3、賦值

mystr str6;str6.p = "abc";

或者

mystr * pstr = & str6;//得到這個結構體變量的指針pstr->p = "abc";

4、動態生成結構體變量

mystr * pstr = (mystr*)malloc(sizeof(mystr));pstr->p = "abc";

注意,如果是動態生成的結構體變量(用到了malloc),則必須在丟棄該變量前將他的內存空間釋放掉(用free)。
如果結構體內部也存在動態生成的對象,在釋放結構體之前要先釋放掉其內部的內存空間,如下

pstr->p = (char*)malloc(sizeof(char)*256);free(pstr->p);free(pstr);

三、結構體數組

我們知道基本數據類型的變量數組直接定義就可以分配空間了,結構體可以看作一種新類型,它也是定義聲明變量之后就會自動分配空間的,結構體的數組也是這樣。

struct book library[10];

這樣就定義了一個有10個book變量的數組,并且已經分配了存儲空間。 結構體的數組和普通數組索引方式是一樣的。

結構體數組也可以使用字面量初始化方法,如下

struct book lib[2] = { {"apue", "stevens", 128.0}, {"cpp", "prata", 60.0}};

是不是很方便了。要注意最外面的是 { ,不是 [ 哦。 對于成員是一個結構的結構體變量,同樣可以使用字面量初始化,記住,只是初始化,不能用于對結構體變量的賦值哦。

四、指向結構的指針

指向結構體的指針是一個一直都沒有掌握好的點,希望這里能記錄好一點,加強理解。

對于指針有幾個好處,第一:就像指向數組的指針比數組本身更容易操作一樣,指向結構的指針通常也更容易操作; 第二:在早期的C中參數傳遞只能使用結構的指針;第三:很多奇妙的數據表示都是用了包含指向其他結構的指針的結構。

和數組不同,結構的名字不是該結構的地址(即單獨的結構名并不是該結構地址的同義詞),必須使用 & 運算符。聲明一個指針的方式與一個普通變量沒有什么區別:

struct book *cpp;struct book c = { "c primer plus", "prata", 60.1};cpp = &c;

假設 lib 是一個 struct book 的數組,現在用結構指針 cpp 指向 lib[0],那么根據指針的運算規則, cpp+1 會指向 lib[1]。雖然在一般的認識里面,結構體中的元素在存儲器中是一次排列的,所以可以根據各個元素的大小來計算 cpp+1 與 cpp 之間的地址差多少。但是考慮到系統對存儲器的對齊要求,不同的系統對齊的方式可能不一樣,所以使用各個成員大小相加的方式計算結構的存儲大小是不合適的。

五、訪問結構的成員

這個比較簡單,注意結構和指向機構的指針訪問成員的方式不一樣,結構本身使用 .運算符訪問,而指向結構的指針則使用 -> 訪問。

strcut book cpp, *pcpp;...char *title;title = cpp.title;// title = pcpp->title;// title = (*pcpp).title; // 因為 . 的優先級比 * 高,必須要有括號

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第五色综合网| 亚洲图中文字幕| 欧美性视频在线| 亚洲国产成人91精品| 久久视频精品在线| 国产亚洲欧洲高清一区| 国产亚洲欧洲高清一区| 日韩国产中文字幕| 亚洲色图18p| 欧美成aaa人片免费看| 国内精品在线一区| 国产69久久精品成人| 91亚洲国产成人久久精品网站| 欧美另类69精品久久久久9999| 久久精品91久久香蕉加勒比| 韩国国内大量揄拍精品视频| 日韩国产高清污视频在线观看| 久久久精品国产一区二区| 国内精品久久久久久久久| 九九九热精品免费视频观看网站| 91九色视频在线| 国产999精品久久久| 日韩女优人人人人射在线视频| 欧美高清自拍一区| 91国产高清在线| 精品少妇一区二区30p| 午夜精品久久久久久久男人的天堂| 中文字幕日韩精品有码视频| 亚洲精品视频播放| 欧美午夜性色大片在线观看| 97视频在线观看视频免费视频| 欧美日韩中国免费专区在线看| 亚洲午夜av久久乱码| 欧美综合激情网| 欧美极品少妇xxxxⅹ免费视频| 欧美一级视频在线观看| 成人伊人精品色xxxx视频| 按摩亚洲人久久| 日韩a**站在线观看| 日本久久久久久久久久久| 国产精品中文字幕在线观看| 欧美中文字幕在线观看| 久久av红桃一区二区小说| 亚洲一区二区三| 亚洲精品国产品国语在线| 亚洲第一区在线观看| 色噜噜国产精品视频一区二区| 国产精品一区二区三区久久| 国模精品一区二区三区色天香| 中文字幕国产亚洲| 久久精品久久精品亚洲人| 日韩精品中文字幕久久臀| 亚洲色图欧美制服丝袜另类第一页| 亚洲女人被黑人巨大进入al| 欧洲永久精品大片ww免费漫画| 国产精品老牛影院在线观看| 7777免费精品视频| 亚洲丝袜av一区| 免费不卡欧美自拍视频| 亚洲激情中文字幕| 日韩免费在线免费观看| 欧美激情免费观看| 91久久综合亚洲鲁鲁五月天| 97国产精品久久| 97超级碰碰碰| 日本成人精品在线| 在线看片第一页欧美| 国产日韩欧美在线看| 久久精品99久久久香蕉| 久久精品夜夜夜夜夜久久| 亚洲qvod图片区电影| 国产亚洲精品成人av久久ww| 国产精品久久久久不卡| 中文字幕亚洲一区二区三区| 欧美激情图片区| 国产91精品高潮白浆喷水| 国产精品精品国产| 国产精品视频一区二区三区四| 91极品女神在线| 日韩av免费在线| 久久久女人电视剧免费播放下载| 国产精品美乳一区二区免费| 欧美国产日韩一区| 精品国产户外野外| 欧美在线视频观看免费网站| 成人有码视频在线播放| 黑丝美女久久久| 欧美日韩另类字幕中文| 亚洲欧美日韩中文在线| 欧美激情视频给我| 啊v视频在线一区二区三区| 亚洲欧美一区二区精品久久久| 欧美香蕉大胸在线视频观看| 日韩av在线电影网| 亚洲欧美一区二区三区在线| 国产亚洲精品综合一区91| 欧美日韩第一页| 一区二区国产精品视频| 日韩在线不卡视频| 亚洲大尺度美女在线| 日韩av资源在线播放| 97色伦亚洲国产| 国外成人在线直播| 日韩中文字幕网| 中文一区二区视频| 综合激情国产一区| 色无极亚洲影院| 欧美专区在线播放| 国产精品美乳一区二区免费| 国产日韩欧美在线观看| 成人免费视频在线观看超级碰| 国产精品xxxxx| 欧美裸身视频免费观看| 国产欧美欧洲在线观看| 国产精品高潮视频| 欧美电影在线观看高清| 欧美在线亚洲一区| 日韩大陆毛片av| 国产精品第三页| 这里只有精品久久| 久久久久久久网站| 日韩电视剧免费观看网站| 国产日韩欧美在线视频观看| 国产精品美女主播在线观看纯欲| 自拍偷拍亚洲精品| 亚洲精品久久久久久久久久久久| 欧美与黑人午夜性猛交久久久| 97精品国产97久久久久久春色| 久久精品视频99| 欧美亚洲国产视频| 亚洲摸下面视频| 欧美日本国产在线| 国产精品欧美日韩一区二区| 久久久午夜视频| 自拍偷拍亚洲在线| 成人有码在线播放| 中文字幕精品久久久久| 亚洲欧美综合区自拍另类| 北条麻妃99精品青青久久| 欧美日韩成人网| 欧美电影免费观看高清完整| 91香蕉嫩草神马影院在线观看| 国产精品高潮呻吟久久av野狼| 成人免费高清完整版在线观看| 一区二区三区四区在线观看视频| 亚洲福利视频久久| 亚洲精品乱码久久久久久金桔影视| 深夜成人在线观看| 欧美成人激情图片网| 欧美孕妇毛茸茸xxxx| 欧美综合在线第二页| 亚洲黄色av女优在线观看| 久久人人爽亚洲精品天堂| 日韩中文在线观看| 国产欧美精品一区二区| 亚洲男人天堂古典| 狠狠躁夜夜躁人人爽天天天天97| 国产成人精品一区二区在线| 精品国产一区二区三区四区在线观看| 国产女精品视频网站免费| 综合网中文字幕| 欧美日韩激情美女| 日本精品视频网站| 色琪琪综合男人的天堂aⅴ视频|