結構體 結構體變數 結構體指標的基本問題

2021-10-06 12:17:31 字數 4407 閱讀 4872

注意:以下都是32位的系統

一、結構體定義

第乙個問題:下面兩個

struct human;

struct human;

這兩個結構體是否相同?

答案: 不一樣

原因: 根據c語言結構體的機制,我們為結構體變數分配乙個連續空間時,總是以結構體中最大位元組長度型別的整數倍分配。

第乙個的記憶體分布圖:

***                                length                                      name[3]

四個位元組 四個位元組 四個位元組

總佔據 12個位元組

第二個的記憶體分布圖

name[3]              ***                       length

3個位元組 1個位元組 4個位元組

總佔據 8個位元組

**驗證:

1 #include 23

struct student ;11

intmain()

12執行結果:

book@www.

100ask.org:

~/ablerry$ vi 1.c

book@www.

100ask.org:

~/ablerry$ gcc -o 8

1.c1.c: in function 『main』:

1.c:13:

9: warning: format 『%d』 expects argument of type 『int』, but argument 2 has type 『long

unsigned

int』 [

-wformat=

]printf

("%d\n"

,sizeof

(struct student));

^book@www.

100ask.org:

~/ablerry$ ./8

12

1 #include 23

struct student ;9

intmain()

101.c: in function 『main』:

1.c:13:

9: warning: format 『%d』 expects argument of type 『int』, but argument 2 has type 『long

unsigned

int』 [

-wformat=

]printf

("%d\n"

,sizeof

(struct student));

^book@www.

100ask.org:

~/ablerry$ ./7

bash:./

7: no such file or directory

book@www.

100ask.org:

~/ablerry$ ./8

8

第二種情況 其中帶結構體自身的指標 記憶體大小該如何算

1 #include 23

typedef

struct student student;

1011

struct num ;17

intmain()

18執行結果:

book@www.

100ask.org:

~/ablerry$ gcc -o 8

1.c1.c: in function 『main』:

1.c:19:

9: warning: format 『%d』 expects argument of type 『int』, but argument 2 has type 『long

unsigned

int』 [

-wformat=

]printf

("student size: %d\n"

,sizeof

(student));

^1.c:20:

9: warning: format 『%d』 expects argument of type 『int』, but argument 2 has type 『long

unsigned

int』 [

-wformat=

]printf

("num size: %d\n"

,sizeof

(struct num));

^book@www.

100ask.org:

~/ablerry$ ./8

student size:

8num size:

16

第三種情況結構體中帶指標函式 記憶體該如何計算

1 #include 23

typedef

struct student student;

1011

struct num ;18

intmain()

19執行結果:

book@www.

100ask.org:

~/ablerry$ gcc -o 8

1.c1.c: in function 『main』:

1.c:20:

9: warning: format 『%d』 expects argument of type 『int』, but argument 2 has type 『long

unsigned

int』 [

-wformat=

]printf

("student size: %d\n"

,sizeof

(student));

^1.c:21:

9: warning: format 『%d』 expects argument of type 『int』, but argument 2 has type 『long

unsigned

int』 [

-wformat=

]printf

("num size: %d\n"

,sizeof

(struct num));

^book@www.

100ask.org:

~/ablerry$ ./8

student size:

8num size:

24

綜合三種情況基本結論如下:

1.根據c語言結構體的機制,我們為結構體變數分配乙個連續空間時,總是以結構體中最大位元組長度型別的整數倍分配。

2.在考慮到第一點的情況下,結構體的大小總是取決於結構體裡面的資料型別大小

二、結構體的訪問方式

第一種 普通的結構體型別

typdef struct num num;

num *p;

請問如何訪問結構體指標p中 a 和 b 兩個成員

指標直接訪問:

p->a;

p->b;

指標間接訪問:     //為什麼稱之為間接訪問    *  是間接訪問符

(*p).a

(*p).b

**驗證如下:

1 #include 23

typedef

struct num num;

78 num *p;

9 num data1 =;10

intmain()

11執行結果如下:

book@www.

100ask.org:

~/ablerry$ gcc -o c_struct 2.c

book@www.

100ask.org:

~/ablerry$ .

/c_struct

p->a:

65p->b:23(

*p).a:65(

*p).b:

23

第二種 帶指標的結構體

typedef struct num num;

num *p;

舉例如下:

1 #include 23

typedef

struct num num;

89 num *p1;

1011 num data1 =;12

intmain()

13~

這個訪問結構體成員體變數的 方法就是l兩種方式 p1->a (*p1).a

結構體型別 結構體變數 結構體陣列 結構體指標

問題1 一元錢換為1 2 5分的硬幣,有多少種兌換方?本題要點分析及參 對各種可能情況進行一一測試。這是實現迴圈的一種方式 窮舉法 但實際上只有只有餘額才能兌換成其它面值的硬幣 main 注意換行的控制和每列的對齊 問題3 某鐵路線上有10個站,需要準備多少種客票?main b a 0 p prin...

結構體指標與結構體中變數的指標

結構體指標與結構體變數指標的區別,在進行實現的工程專案中會有許多地方用到結構體指標的情況,在使用這前都需要先malloc一塊空間之後才能有空間進入儲存資料,例項 如下 include includetypedef struct student student t,pstudent t void pr...

結構體變數和指向結構體變數的指標

目錄概念 記憶體分配 物件的引用 結構體變數和結構體指標變數作形參的區別 以結構體變數和結構體指標變數形參的函式呼叫 結構體變數是指將不同的資料型別整合成乙個有機的整體,以便於呼叫。struct student student stud1 stud1就是結構體變數結構體指標變數是指指向結構體變數的指...