結構體,求解釋不同,陣列與結構體的區別

2022-12-20 11:51:41 字數 5606 閱讀 1734

1樓:

上面那個第乙個結構體在宣告乙個名為『bitnode』結構體的同時定義了乙個名為『bitnode』的結構體變數,類似於int i,只不過int是編譯器自帶的一種變數型別;第二個結構體如果加上:typedef bitnode bitnode;就和第乙個一樣了。

第二個問題其實在第一問已經解決了,就是自定義型別後定義的兩個結構體變數。

2樓:匿名使用者

typedef 用於設定型別的別稱

比如typedef int integer這樣以後用integer a與int a是乙個意思你的第一種情況是宣告乙個結構體,這個好理解第二種情況不但宣告了結構體,還將這種結構體型別設定別稱為bitnode

如果別稱為*bitree,則使用bitree bt定以後,bt為該結構體的指標

等同於bitnode *bt

3樓:匿名使用者

對於ansi c來說, 必須使用第一種

對於c++來說, 兩種寫法都一樣

*****

bitnode 是這個struct的型別

bitree 則是這個struct型別的指標

陣列與結構體的區別

4樓:騎理想的喵

陣列與結構體的主要區別如下:

1、定義不同

陣列是有序的元素序列。若將有限個型別相同的變數的集合命名,那麼這個名稱為陣列名。組成陣列的各個變數稱為陣列的分量,也稱為陣列的元素,有時也稱為下標變數;

結構體(struct)是由一系列具有相同型別或不同型別的資料構成的資料集合,叫做結構。

2、資料型別不同

陣列是相同型別元素(元素可以是原子型別的整型、浮點型、字元型或者結構體、陣列等)的集合;

結構體是不同型別元素(元素可以是原子型別的整型、浮點型、字元型或者結構體、陣列等)的集合。

3、呼叫方式不同

陣列可以直接利用下標訪問;

而結構體必須使用結構中成員的變數名。

5樓:天雲小店

1、定義上的區別:

陣列是同型別資料的集合;結構體可以是同型別也可以是不同型別資料的集合。

舉例如下:

int a[5]; // 陣列a的5個元素都是int型別

struct stu

std; // 結構體std的三個成員分別是int型、char型和float型,資料型別不同。

2、呼叫時候的區別

資料是直接用形如「陣列名[下標]」的方式呼叫,如a[3],表示陣列a的第4個元素(陣列下標從0開始);

結構體是用結構體成員運算子來呼叫的,如:std.num,表示呼叫結構體std中的num變數。

6樓:匿名使用者

他們都是資料結構,不過陣列只能存放同樣型別的資料,而結構體則能夠存放不同型別的資料,結構體裡面也可以有結構體。

7樓:長壽湖畔有人家

陣列一次只能宣告為乙個型別

結構體可以有多個型別

求解釋線性表與結構體陣列的區別與聯絡。

8樓:無語翹楚

陣列和結構體的區別:

陣列是相同資料型別的元素按一定順序排列而成的集合,是一種順序表結構。

在c語言中, 陣列屬於構造資料型別。乙個陣列可以分解為多個陣列元素,這些陣列元素可以是基本資料型別或是構造型別。

陣列又可分為數值陣列、字元陣列、指標陣列、結構陣列等各種類別。

結構體是由一系列具有相同型別或不同型別的資料構成的資料集合。結構體在函式中的作用不是簡便,其最主要的作用就是封裝。

9樓:baby速度

區別:1.陣列在記憶體中是連續分布的,順序存放,乙個陣列站一塊記憶體。

而線性表在記憶體中可能不是連續的,是分散存放的,表的節點可能分布的很散,所以需要在節點中包含指向下乙個節點的指標來找到下乙個節點。

2.陣列一定義,大小就不能更改了,系統給陣列分配了一塊記憶體。線性表的大小是可以變的。

聯絡:線性表的乙個節點就是乙個結構體,結構體中的元素在記憶體中是連續存放的。所以結構體陣列在記憶體中是連續站用的一塊記憶體。

線性表是分散占用了很多塊記憶體,每個表節點(就是乙個結構體)占用一塊連續記憶體,各個節點一般在記憶體中是不連續的。

舉個例子:

有個結構體陣列和線性表,大小是1g;假設計算機記憶體4g,這時候空閒了2g的記憶體,這2g的記憶體可能是分成了很多小塊零散的分布的。所以這時候如果用結構體陣列的話可能會失敗,因為計算機記憶體可能沒有一整塊1g的空閒記憶體空間來放置陣列;但是用線性表就可以用記憶體中分散的空餘空間來儲存這些資料。

10樓:匿名使用者

首先要明白陣列在記憶體中是連續分布的,順序存放,乙個陣列站一塊記憶體。

但是乙個線性表在記憶體中可能不是連續的,是分散存放的,表的節點可能分布的很散,所以需要在節點中包含指向下乙個節點的指標來找到下乙個節點。

陣列一定義,大小就不能更改了,系統給陣列分配了一塊記憶體。線性表的大小是可以變的。

線性表的乙個節點就是乙個結構體,結構體中的元素在記憶體中是連續存放的。所以結構體陣列在記憶體中是連續站用的一塊記憶體。

線性表是分散占用了很多塊記憶體,每個表節點(就是乙個結構體)占用一塊連續記憶體,各個節點一般在記憶體中是不連續的。

舉個例子:

有個結構體陣列和線性表,大小是1g;假設計算機記憶體4g,這時候空閒了2g的記憶體,這2g的記憶體可能是分成了很多小塊零散的分布的。所以這時候如果用結構體陣列的話可能會失敗,因為計算機記憶體可能沒有一整塊1g的空閒記憶體空間來放置陣列;但是用線性表就可以用記憶體中分散的空餘空間來儲存這些資料。

陣列和結構體有什麼區別?

11樓:匿名使用者

簡單的說:他們都是資料結構,不過陣列只能存放同樣型別的資料,而結構體則能夠存放不同型別的資料,結構體裡面也可以有結構體。

12樓:匿名使用者

陣列是一組同型別的資料集合,形象簡單點你可以認為是數學的數列;

而結構體是一類特殊的資料型別,由自己定義,比如說我們做乙個鐘的類,我們定義鐘的資料結構,就可以用結構體定義三個整型變數(分、時、秒)作為鐘的資料結構,三個整型變數作為乙個結構體。

13樓:匿名使用者

陣列是線性的 只能儲存一種型別的資料

如 int a[10]

結構體能儲存多種型別的資料 如

struct treea;

14樓:匿名使用者

....完全是兩個東西 怎麼會拿來比較

機構體 裡面可以有不同的型別來放各種資料

陣列 可能存放一種型別的 資料

c語言,利用兩個結構體變數求解複數的積

結構體型別的長度計算

15樓:等待的幸福快樂

計算方法:

運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof(char) = 1; sizeof(int) = 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。

c語言中的構造資料型別有三種:陣列、結構體和共用體。

陣列是相同型別的元素的集合,只要會計算單個元素的大小,整個陣列所佔空間等於基礎元素大小乘上元素的個數。

結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對齊問題。看下面這樣的乙個結構體:

struct stu1

;先介紹乙個相關的概念——偏移量。偏移量指的是結構體變數中成員的位址和結構體變數位址的差。結構體大小等於最後乙個成員的偏移量加上最後乙個成員的大小。

顯然,結構體變數中第乙個成員的位址就是結構體變數的首位址。因此,第乙個成員i的偏移量為0。第二個成員c的偏移量是第乙個成員的偏移量加上第乙個成員的大小(0+4),其值為4;第三個成員j的偏移量是第二個成員的偏移量加上第二個成員的大小(4+1),其值為5。

實際上,由於儲存變數時位址對齊的要求,編譯器在編譯程式時會遵循兩條原則:一、結構體變數中成員的偏移量必須是成員大小的整數倍(0被認為是任何數的整數倍) 二、結構體大小必須是所有成員大小的整數倍。

對照第一條,上面的例子中前兩個成員的偏移量都滿足要求,但第三個成員的偏移量為5,並不是自身(int)大小的整數倍。編譯器在處理時會在第二個成員後面補上3個空位元組,使得第三個成員的偏移量變成8。

對照第二條,結構體大小等於最後乙個成員的偏移量加上其大小,上面的例子中計算出來的大小為12,滿足要求。

再看乙個滿足第一條,不滿足第二條的情況

struct stu2

;成員k的偏移量為0;成員t的偏移量為4,都不需要調整。但計算出來的大小為6,顯然不是成員k大小的整數倍。因此,編譯器會在成員t後面補上2個位元組,使得結構體的大小變成8從而滿足第二個要求。

由此可見,大家在定義結構體型別時需要考慮到位元組對齊的情況,不同的順序會影響到結構體的大小。對比下面兩種定義順序

struct stu3

struct stu4

雖然結構體stu3和stu4中成員都一樣,但sizeof(struct stu3)的值為12而sizeof(struct stu4)的值為8。

如果結構體中的成員又是另外一種結構體型別時應該怎麼計算呢?只需把其即可。但有一點需要注意,後的結構體的第乙個成員的偏移量應當是被的結構體中最大的成員的整數倍。看下面的例子:

struct stu5

ss;int k;

}結構體stu5的成員ss.c的偏移量應該是4,而不是2。整個結構體大小應該是16。

如何給結構體變數分配空間由編譯器決定,以上情況針對的是linux下的gcc。其他平台的c編譯器可能會有不同的處理。

16樓:匿名使用者

不能像樓主這樣解釋,計算結構體的長度,不能忽略乙個引數:

#pragma pack(8); //這個8是結構體預設的對齊引數,其作用是:

1>當結構體中有變數型別佔的長度比這個大,那麼該結構的對齊引數就是8;

2>如果結構體中成員的型別都比這個預設值小,那麼該結構體的對齊引數就是該結構體中占用空間最長的成員變數的長度,如instruct a;的對齊長度是1(字元變數佔1個位元組)

根據樓主的輸出,樓主的執行環境pack(4),因為a中double佔的字元大於4,所以結構體a的對齊引數為4,那麼結果就是4+4+4,實際後面兩個4是存乙個double資料;第二題int a;已經等於4,所以對齊變數為4。

當知道對齊規則後,那麼記憶體是怎麼排列的呢?

定義變數的時候先找到乙個記憶體位址,根據計算機的內部結構(我還不是很清楚),會選用乙個可用的,而且對對齊變數求余為0的位址作為儲存該結構體的位址。

如2題既然對齊變數為4,那麼一定會選乙個4的整數倍的位址作為儲存這個結構體的起始位址,

然後是10個char型別,佔10個位元組,此時,下面的位址已經不能整除4了,比如8+10=18已經不能整除4,所以會空2個位元組,從20開始儲存int,正好4個位元組,位址變為24,能被4整除,也就是char s[10]和int a,占用了12(有2個空位元組)+4=16個位元組,由於int a後的位址能被4整除,所以a k,的長度就是a的長度為12,所以b的長度為28。

你可以#pragma pack(8);來修改預設的對齊引數來測試。

關於指標和結構體的,結構體指標和結構體中的指標的區別

dulnode 是個雙鏈表節點的結構體。大括號內是對它的定義。prior 是指向當前節點的前乙個節點的指標。next 是指向當前節點的後乙個節點的指標。定義了乙個結構型別 struct dulnode 其中dulnode就表示這個型別 等價 dulinklist表求指向這個型別的指標型別 dulno...

岩體 岩石 結構面 結構體之間的關係

要確定它們之間的關係肯定要從它們的定義說起 岩體是地質體,它經歷多次反覆的地質作用,經受過變形,遭受過破壞,形成一定的岩石成分和結構,賦存在一定的地質環境中。在上訴岩體內存在各種地質介面,它包括地質分異面和不連續面,如假整合 不整合 斷層 層理 節理 片理等。這些不同成因 不同特性的地質介面統稱為結...

請問結構體陣列賦值的方法?具體看下面

應該可以這樣 for int i 0 i 10 i strcpy char dest,char src 第乙個引數是目標位址,第二個是要複製的源位址 注意只要提供首位址即可 strcpy函式,兩個引數必須是字元型指標型別,第二個引數必須是完整的字串,也就是必須帶 0 結束標誌。不能strcpy us...