1、结构体所占字节空间的大小:
struct STU
{
char b; (8 byte) (4 byte)
double a; (8 byte) (8 byte)
char c; (8 byte) (4 byte)
int num; (4byte) (4 byte)
float score; ( 4byte) (4 byte)
}
window(32/64)VC6.0:总的字节数为:32 byte ;
linux(32/64)/GCC: 总的字节数为:24 byte;
字节对齐:与最大字节成员对齐。(对齐参数的倍数)
PS-->自身对其参数:结构体其他成员与其字节对齐时候的字节数。
(在windows(32)/VC6.0下各种类型的变量的自身对齐参数就是该类型变量所占字节数的大小,而在linux(32)/GCC下double类型的变量自身对齐参数是4,是因为linux(32)/GCC下如果该类型变量的长度没有超过CPU的字长,则以该类型变量的长度作为自身对齐参数,如果该类型变量的长度超过CPU字长,则自身对齐参数为CPU字长,而32位系统其CPU字长是4,所以linux(32)/GCC下double类型的变量自身对齐参数是4,如果是在Linux(64)下,则double类型的自身对齐参数是8。)
注意结构体成员为指针的使用!!(不要使用野指针)
struct STU
{
char name[15];
//char *p ; (没有指向具体的地址空间)
int num;
float score;
}
2、 结构体类型变量的定义
变量的定义:数据类型 变量名;
变量数据类型:变量所存储的数据的类型决定;
结构体类型变量的定义:3种方式;
①在定义结构体类型的同时,定义结构体类型的变量;
struct STU
{
int num;
char name[10];
float score;
}s1;
②先定义结构体类型,然后提取类型,再定义变量;
struct STU s1,s2,s3;
③定义匿名的结构体类型
扩展:typedef
typedef 类型重定义----->给类型取别名
形式:typedef 原类型名 别名;
(1)基本类型重定义:typedef unsigned char U8
(2)结构体类型重定义:typedef struct student
{
int num;
char name[10];
float score;
}STU;
//struct student 等价于 STU
(3)数组类型取别名:typedef int Array[10]; //Array是数组的新类型名
int main()
{
Array a;//等价于int a[10];
a[0]=9;
printf("a[0]=%d\n",a[0]);
return 0;
}
(4)函数指针类型重定义:
int(*padd)(int,int);//函数指针的定义
typedef int(*padd)(int,int);
//padd就是函数指针的新类型名;
padd p; 等价于 int (*p)(int,int);
3、结构体类型变量的初始化
形式:struct 结构体名 变量名={成员,成员.........};
示例:struct STU s1={101,"张三",98.8};
4、结构体类型变量成员访问
形式:变量名.成员名
示例:
#include<stdio.h>
struct STU
{
int num;
char name[10];
float score[3];
};
int main()
{
struct STU s1={101,"张三",{98.8,88,78}};//初始化
struct STU s2;
printf("%d %s %f %f %f\n",s1.num,s1.name,s1.score[0],s1.score[1],s1.score[2]);
return 0;
}
结构体类型嵌套使用:
#include<stdio.h>
struct SCORE
{
float score1;
float score2;
float score3;
};
struct STU
{
int num;
char name[10];
struct SCORE s;
};
int main()
{
struct STU s1={101,"张三",98.8,88,78};//初始化
struct STU s2;
printf("%d %s\n",s1.num,s1.name);
printf("成绩:%.2f %.2f %.2f\n",s1.s.score1,s1.s.score2,s1.s.score3);
//结构体类型嵌套使用的时候,在访问成员的时候要逐层访问;
return 0;
}
5 、结构体类型变量的赋值
注意:
①除初始化以外,结构体类型变量不能整体赋值,只能采用
引用的方式逐一赋值;
#include<stdio.h>
#include<string.h>
struct SCORE
{
float score1;
float score2;
float score3;
};
struct STU
{
int num;
char *name;
struct SCORE s;
};
int main()
{
struct STU s1={101,"张三",98.8,88,78}; //初始化
//无论以什么方式访问成员,都看的是成员本身的性质;
s1.num=111;//赋值
s1.name="lisi";//如果成员是数组,不能以此方式进行赋值,如果成员是指针,那么可以用此方式赋值;
strcpy(s1.name,"lisi");
s1.s.score3=80;
//以输入的方式进行赋值
printf("输入数据:");
scanf("%d %s %f %f %f",&s1.num,s1.name,&s1.s.score1,&s1.s.score2,&s1.s.score3);
printf("%d %s\n",s1.num,s1.name);
printf("成绩:%.2f %.2f %.2f\n",s1.s.score1,s1.s.score2,s1.s.score3);
//结构体类型嵌套使用的时候,在访问成员的时候要逐层访问;
return 0;
}
6、结构体类型数组
(1)结构体类型数组的定义:3种形式;
#include<stdio.h>
#include<string.h>
struct STU
{
int num;
char name[10];
float score;
};
int main()
{
int i;
//初始化
struct STU a[3]={
{101,"张三",89},
{102,"李四",90},
{103,"王五",88}
};
//结构体数组中成员的访问:数组名[下标].成员名;
printf("第二个人的成绩:%.2f\n",a[1].score);
printf("输入数据:\n");
for(i=0;i<3;i++)
{
printf("输入第%d个人的信息:",i+1);
scanf("%d %s %f",&a[i].num,a[i].name,&a[i].score);
}
//输出
printf("输出数据:\n");
for(i=0;i<3;i++)
{
printf("%d %s %.2f\n",a[i].num,a[i].name,a[i].score);
}
return 0;
}
7 、结构体类型指针
结构体类型指针指向变量:
#include <stdio.h>
int main()
{
struct STU s={101,"张三",90};
struct STU *ps=&s;//指针指向变量s
/*指针访问成员:
1.(*指针名).成员名;
2.指针名->成员名;
*/
printf("输入数据:");
scanf("%d %s %f",&(*ps).num,ps->name,&ps->score);
printf("%-10d %-15s %.2f\n",s.num,s.name,s.score);
printf("%-10d %-15s %.2f\n",(*ps).num,ps->name,ps->score);
return 0;
}
结构体类型指针指向数组:
示例:
#include<stdio.h>
#include<string.h>
struct STU
{
int num;
char name[10];
float score;
};
int main()
{
int i;
//初始化
struct STU a[3]={
{101,"张三",89},
{102,"李四",90},
{103,"王五",88}
};
struct STU *pa=a;//指针指向数组
//结构体数组中成员的访问:数组名[下标].成员名;
printf("第二个人的成绩:%.2f\n",a[1].score);
printf("输入数据:\n");
for(i=0;i<3;i++)
{
printf("输入第%d个人的信息:",i+1);
//scanf("%d %s %f",&a[i].num,a[i].name,&a[i].score);
scanf("%d %s %f",&(*(pa+i)).num,(pa+i)->name,&(pa+i)->score);
}
//输出
printf("输出数据:\n");
for(i=0;i<3;i++)
{
//printf("%d %s %.2f\n",a[i].num,a[i].name,a[i].score);
printf("%d %s %.2f\n",(*(pa+i)).num,(pa+i)->name,(pa+i)->score);
}
return 0;
}
共用体
数据类型:四类
基本数据类型:整型,字符型,浮点型;
构造数据类型:数组,结构体,共用体(联合体);
指针
空类型:void void * (万能指针)
共用体性质:一组具有相同或者不同数据类型的数据的有序集合,
但是所有成员共用同一个地址空间;
共用体类型的定义:
union 共用体名
{
成员列表;
};
示例:
#include<stdio.h>
int main()
{
//共用体类型的定义
union Data
{
char c;
int d;
float f;
};
printf("size=%d\n",sizeof(union Data));
union Data data={.f=33333.1456};//共用体类型变量的定义,以及初始化
//共用体成员的访问与结构体方式相同,变量名.成员名;
data.c='x';
printf("c=%c\n",data.c);
data.d=2147483647;
printf("d=%d\n",data.d);
printf("f=%f\n",data.f);
return 0;
}