結構體&結構體陣列
阿新 • • 發佈:2019-01-05
1、結構體的定義
struct 結構體型別名
{
型別名 成員名;
型別名 成員名;
……
};
先宣告結構體型別,再定義結構體變數名
宣告結構體型別,不分配空間
定義結構體型別變數,就要分配記憶體空間
1)結構體被分配的記憶體空間
struct student { int num;//4位元組 char name[20];//20位元組 char sex;//1位元組,但因為記憶體對齊佔4位元組 int age;//4位元組 double score;//8位元組 char addr[30];//30位元組,記憶體對齊佔32位元組 }; int main() { struct student stu1,stu2; printf("%d\n",sizeof(stu1)); return 0; }
2)結構體的巢狀
/* *copyright(c) 2018,HH *All rights reserved. *作 者:HH *完成日期:2018年8月15日 *版本號:v1.0 * *問題描述:結構體巢狀、賦值、輸出 *輸入描述:; *程式輸出: */ #include<stdio.h> #include<string.h> struct date { int month; int day; int year; }; struct student { int num; char name[20]; char sex; struct date birthday; float score; }; struct student1; struct student2={10002,"MaYun",'f',8,28,2000,99.9999}; int main() { student1=student2; printf("%d\n",student1.num); printf("%s\n",student1.name); printf("%c\n",student1.sex); printf("%d\n",student1.date birthday.month); printf("%d\n",student1.date birthday.day); printf("%d\n",student1.date birthday.year); printf("%f\n",student1.score); return 0; }
3)結構體的成員是陣列
/* *copyright(c) 2018,HH *All rights reserved. *作 者:HH *完成日期:2018年8月14日 *版本號:v1.0 * *問題描述:結構體輸出 *輸入描述:; *程式輸出: */ #include<stdio.h> #include<string.h> struct student//自定義結構體 { int num;//學號 char name[10];//名字 double score[3];//三科成績 }; void print(struct student s)//自定義輸出函式 { printf("%ld %s\n",s.num,s.name); printf("%1f %1f %1f\n",s.score[0],s.score[1],s.score[2]); } int main() { struct student stu; stu.num=42001; strcpy(stu.name,"MaHuTeng");//字串賦值函式,將字串複製到資料項name中 stu.score[0]=98,stu.score[1]=99,stu.score[2]=100; print(stu); return 0; }
2、結構體陣列
定義:該陣列的每個元素都是一個結構體。
結構體陣列的初始化及直接輸出方法:
/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年8月16日
*版本號:v1.0
*
*問題描述:結構體陣列的正確初始化及輸出
*輸入描述:;
*程式輸出:
*/
#include<stdio.h>
#include<string.h>
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
int main()
{
int i;
struct student stu[3]={{10101,"LiuHu",'F',18,99.7,"beijing road"},{10102,"NaoDan",'M',17,99.8,"shanghai road"},{10103,"MaHuangTeng",'F',48,99.9,"shenzhen road"}};
for(i=0;i<3;i++)
{
printf("%d %s %c %d %1f %s\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].score,stu[i].addr);
}
return 0;
}
以下為自定義函式呼叫的方式實現結構體陣列的輸出:
/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年8月16日
*版本號:v1.0
*
*問題描述:結構體陣列的正確初始化及輸出(函式呼叫的方法)
*輸入描述:;
*程式輸出:
*注意,陣列地址傳遞容易出錯
*/
#include<stdio.h>
#include<string.h>
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
struct student s[3];
void print(struct student s[3])//自定義輸出函式以供呼叫
{
int i;
for(i=0;i<3;i++)
{
printf("%d %s %c\n",s[i].num,s[i].name,s[i].sex);
printf("%d %1f %s\n",s[i].age,s[i].score,s[i].addr);
}
}
int main()
{
struct student stu[3]={{10101,"LiuHu",'F',18,99.7,"beijing road"},{10102,"NaoDan",'M',17,99.8,"shanghai road"},{10103,"MaHuangTeng",'F',48,99.9,"shenzhen road"}};
print(stu);//若此處寫成print(stu[])則會報錯expected expression before'print'
return 0;
}
在此方法中,由於print()函式的定義
print(stu)不會報錯
而print (stu[ ])會報錯,
陣列名等價於等同於指向陣列首元素的指標,stu[ ]代表的是陣列,而stu代表指向的陣列首地址的指標
報錯原因是,因為被呼叫函式的形參物件是陣列名,而不是陣列!