最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中結(jié)構(gòu)體struct編寫的一些要點解析

 更新時間:2016年04月20日 10:56:05   作者:whuslei  
這篇文章主要介紹了C語言中結(jié)構(gòu)體struct編寫的一些要點解析,談到了結(jié)構(gòu)體的聲明和指針指向等重要知識點,需要的朋友可以參考下

一、關(guān)于結(jié)構(gòu)體的聲明
1、匿名聲明。如:

struct {
  int i,j;
}point;

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

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、顯式聲明一個結(jié)構(gòu)體

struct node{
  int i,j;
};

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

3、用typedef來簡化結(jié)構(gòu)體的寫法

typedefstruct {
  int i,j;
}Node;

相當(dāng)于把代碼改名為Node了。以前需要這樣聲明"struct node n1;",現(xiàn)在只需要"Node n1;"。
這段代碼中,如果沒有typedef,代碼的意思是"聲明了一個匿名結(jié)構(gòu)體變量"!注意區(qū)別。
4、在結(jié)構(gòu)體中聲明結(jié)構(gòu)體變量。

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

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

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

二、關(guān)于結(jié)構(gòu)體的賦值
1、聲明一個變量后的默認(rèn)值

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

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

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"在內(nèi)存中的地址;而str2.ch是一個常量字符指針(無法操作指針),代表的是字符數(shù)組,也就是將常量字符串"def"逐字符copy到ch數(shù)組里,賦值結(jié)束后,ch的值是:'d','e','f','\0','\0'……
也可以像str3這樣初始化結(jié)構(gòu)體中的某些變量,值得注意的是str4和str5。對于數(shù)組(如 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;//得到這個結(jié)構(gòu)體變量的指針
pstr->p = "abc";

4、動態(tài)生成結(jié)構(gòu)體變量

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

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

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

三、結(jié)構(gòu)體數(shù)組

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

struct book library[10];

這樣就定義了一個有10個book變量的數(shù)組,并且已經(jīng)分配了存儲空間。 結(jié)構(gòu)體的數(shù)組和普通數(shù)組索引方式是一樣的。

結(jié)構(gòu)體數(shù)組也可以使用字面量初始化方法,如下

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

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

四、指向結(jié)構(gòu)的指針

指向結(jié)構(gòu)體的指針是一個一直都沒有掌握好的點,希望這里能記錄好一點,加強(qiáng)理解。

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

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

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

cpp = &c;

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

五、訪問結(jié)構(gòu)的成員

這個比較簡單,注意結(jié)構(gòu)和指向機(jī)構(gòu)的指針訪問成員的方式不一樣,結(jié)構(gòu)本身使用 .運(yùn)算符訪問,而指向結(jié)構(gòu)的指針則使用 -> 訪問。

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

相關(guān)文章

  • 詳解Qt如何實現(xiàn)一鍵加載qm文件

    詳解Qt如何實現(xiàn)一鍵加載qm文件

    這篇文章主要為大家詳細(xì)介紹了Qt實現(xiàn)一鍵加載qm文件的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考下
    2024-04-04
  • 詳解C語言之文件操作(上)

    詳解C語言之文件操作(上)

    這篇文章主要介紹了關(guān)于C語言文件操作方法的相關(guān)資料,小編覺得這篇文章寫的還不錯,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-11-11
  • 用C++來解決3*3拼圖的問題

    用C++來解決3*3拼圖的問題

    這篇文章主要介紹了用C++來解決3*3拼圖的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • c語言 樹的基礎(chǔ)知識(必看篇)

    c語言 樹的基礎(chǔ)知識(必看篇)

    下面小編就為大家?guī)硪黄猚語言 樹的基礎(chǔ)知識(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 深入了解C語言中的動態(tài)內(nèi)存分配

    深入了解C語言中的動態(tài)內(nèi)存分配

    這篇文章主要為大家詳細(xì)介紹了C語言中的動態(tài)內(nèi)存分配,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定的幫助,需要的可以參考一下
    2022-06-06
  • C語言實現(xiàn)快速排序的方法及優(yōu)化

    C語言實現(xiàn)快速排序的方法及優(yōu)化

    這篇文章主要介紹了C語言實現(xiàn)快速排序的方法及優(yōu)化,快速排序是Hoare于1962年提出的一種二叉樹結(jié)構(gòu)的交換排序方法,下面我們來看一看傳說中的快速排序的特點與效率怎么樣,需要的朋友可以參考下
    2023-07-07
  • C語言*與&在操作線性表的作用詳解

    C語言*與&在操作線性表的作用詳解

    本文主要介紹了C語言*與&在操作線性表的作用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++標(biāo)準(zhǔn)模板庫函數(shù)sort的那些事兒

    C++標(biāo)準(zhǔn)模板庫函數(shù)sort的那些事兒

    sort函數(shù)是標(biāo)準(zhǔn)模板庫的函數(shù),已知開始和結(jié)束的地址即可進(jìn)行排序,可以用于比較任何容器(必須滿足隨機(jī)迭代器),任何元素,任何條件,執(zhí)行速度一般比qsort要快
    2013-09-09
  • 一元多項式加法運(yùn)算

    一元多項式加法運(yùn)算

    今天小編就為大家分享一篇關(guān)于一元多項式加法運(yùn)算,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 零基礎(chǔ)詳解C語言指針進(jìn)階

    零基礎(chǔ)詳解C語言指針進(jìn)階

    在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活
    2022-02-02

最新評論

临西县| 容城县| 东丰县| 连平县| 阜新市| 台中市| 宜川县| 常德市| 玛沁县| 南阳市| 吴堡县| 鄱阳县| 三江| 资阳市| 阿城市| 三明市| 定边县| 三河市| 静安区| 福州市| 曲水县| 山东| 肇州县| 高邮市| 营山县| 体育| 台湾省| 新疆| 泗阳县| 大洼县| 东宁县| 宁河县| 石楼县| 陵水| 府谷县| 都江堰市| 邵阳市| 余庆县| 沾化县| 南昌县| 鸡西市|