結構的應用 — Working with Structures
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)。
這次到這邊結束,雖然都講得不多,但這個不分在資料結構中非常重要,請大家觀念要好好釐清。我們下次再見拉~