結構的應用 — Working with Structures

Sharon Peng
4 min readAug 29, 2019

--

現在來講講結構中再出現結構,這個觀念有些複雜,還請大家努力理解一下。

以下的程式範例 source from : sololearn

範例:

typedef struct {
int x;
int y;
} point;

typedef struct {
float radius;
point center; //把上方的struct放到新的struct中
} circle;

那當我們想要進入circle中point center中的成員,要怎麼進入呢?

還記得上次說過的.(dot operator)吧,上次進入一個struct用一個.(dot operator),現在要進入兩層的struct,很簡單的我們可以直用雙層的.(dot operator),進入他的成員列中。

circle c1 = {5.5, {3, 4}}; // 初始化printf(".2%f %d %d\n", c1.radius, c1.center.x, c1.center.y); // 雙層dot operator

結構與指標(Pointer to Structures):

指標與變數的關係可以被定義,指標跟struct的關係也可以。

第一步:定義struct的指標 (struct str_name *ptr;)

第二步:把struct的指標指向struct的變數記憶體位址 (struct_ptr = &struct_var)

第三步:利用->,用指標的方式進入struct的成員列中。

->:透過指標進入結構成員列中

(struct_ptr ->struct_mem) 指標->結構成員 等同於 (*ptr).mem

範例程式碼:

#include<stdio.h>
#include<string.h>
typedef struct
{
char name[40];
char id_num[40];
float heigth;
}student;
void show ( student *st )
{
printf("Student: %s\n", st->name); //也可以寫(*st).name
printf("id_num: %s\n", st->id_num);
printf("Heigth: %.2f\n", st->heigth);
}
int main()
{
student s1;
student s2;
strcpy(s1.name, "Ferry");
strcpy(s1.id_num, "19923456");
s1.heigth = 166.8;
strcpy(s2.name, "Umi");
strcpy(s2.id_num, "199033456");
s2.heigth = 191.1;
show(&s1);
puts("");
show(&s2);
return 0;}

結構中的陣列

我們知道陣列內的元素可以有很多不同型態,其中也包含struct。

以下為範例程式:

#include <stdio.h>

typedef struct {
int x;
int y;
int z;
} box;

int main() {
box boxes[3] = {{2, 6, 8}, {4, 6, 6}, {2, 6, 9}};
int volume;

for (int i = 0; i< 3; i++)
{
volume = boxes[i].x * boxes[i].y * boxes[i].z;
printf("box %d volume %d\n", k, volume);
}
return 0;
}

這邊的陣列跟我們一般認知的陣列沒什麼不同,只是在進入結構成員時,我們是依據陣列在哪一個位子並在他後面加上.(dot operator)。

這次到這邊結束,雖然都講得不多,但這個不分在資料結構中非常重要,請大家觀念要好好釐清。我們下次再見拉~

--

--

Sharon Peng
Sharon Peng

No responses yet