1. 程式人生 > >結構體&結構體陣列

結構體&結構體陣列

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代表指向的陣列首地址的指標

報錯原因是,因為被呼叫函式的形參物件是陣列名,而不是陣列!