在C语言中,可以使用结构体(Struct)来实现用户自定义的数据类型。
C语言可以使用结构体struct来实现用户自定义的数据类型,类似Java语言的类。
struct 结构体名{
结构体所包含的变量或数组
};
实例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SCORE_LEN 5
#define SCHOOL_LEN 50
int main() {
struct Students {
char* name;//姓名
int age;//年龄
int score[SCORE_LEN];//考试分数
char school[SCHOOL_LEN];//学校名称
} s;
s.name = "张三";
s.age = 18;
int arr[]={76,80,77,84,90};
memcpy(s.score,arr,sizeof(int)*SCORE_LEN);//数组拷贝
strcpy(s.school,"西安电子科技大学");//字符串拷贝
printf("姓名:%s\n",s.name);
printf("年龄:%d\n",s.age);
printf("------考试分数------\n");
for(int i=0;i<SCORE_LEN;i++){
printf("%d ",s.score[i]);
}
printf("\n学校:%s\n",s.school);
return 0;
}
运行结果:
姓名:张三
年龄:18
------考试分数------
76 80 77 84 90
学校:西安电子科技大学
如果结构体定义在main外面,需要使用typedef定义结构类型。上例改写如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SCORE_LEN 5
#define SCHOOL_LEN 50
typedef struct {
char* name;
int age;
int score[SCORE_LEN];
char school[SCHOOL_LEN];
} Students;
int main() {
Students s;
s.name = "张三";
s.age = 18;
int arr[]={76,80,77,84,90};
memcpy(s.score,arr,sizeof(int)*SCORE_LEN);
strcpy(s.school,"西安电子科技大学");
printf("姓名:%s\n",s.name);
printf("年龄:%d\n",s.age);
printf("------考试分数------\n");
for(int i=0;i<SCORE_LEN;i++){
printf("%d ",s.score[i]);
}
printf("\n学校:%s\n",s.school);
return 0;
}
结构体的对齐方式确实很浪费空间,可是按照计算机的访问机制,这种对齐方式大大提升了计算机的访问效率。
从结构体的第一个成员向下开始计算,并遵循以下原则: 1. 前面所有成员所占地址空间的大小必须是其后一个成员占地址空间大小的整数倍。(0是任何数的整数倍,或第一个成员除外) 2. 结构体的大小必须是结构体里面各个成员(数组除外;结构中包含结构体,且被包含的结构体只声明,没有定义结构体变量除外;结构体中包含联合体,且联合体只声明,没有定义联合体变量除外)大小的整数倍。
实例:
#include <stdio.h>
typedef struct A {
double a; //8
short b; //2
int c; //4
char d;//1
} obj;
int main(){
printf("size of obj is :%ld\n",sizeof(obj));
return 0;
}
运行结果:
size of obj is :24

注意:结构体的长度计算与成员的定义顺序也有很大的关系,上面代码改写如下:
#include <stdio.h>
typedef struct A {
double a; //8
int c; //4
short b; //2
char d;//1
} obj;
int main(){
printf("size of obj is :%ld\n",sizeof(obj));
return 0;
}
运行结果:
size of obj is :16