1.结构体
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
char name[100];
int age;
};//注意这里有;
int main()
{
struct student st;//定义了一个student类型的结构体变量,名字叫st
st.age=20;
strcpy(st.name,"刘某");
printf("name=%s,age=%d\n",st.name,st.age);
return 0;
}
初始化方法
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
char name[100];
int age;
};//注意这里有;
int main()
{
//struct student st={"王某",50};//定义结构变量的时候,同时初始化成员变量的值,很像数组
//struct student st={"王某"};//定义结构变量的时候,同时初始化成员变量的值,如果没输入,默认零
//struct student st={0};//定义结构变量的时候,同时初始化成员变量的值,字符串空,年龄是0
//struct student st={.age=30, .name="孙某"};//定义结构变量的时候,同时初始化成员变量的值,可以用这种方式打乱顺序
printf("name=%s,age=%d\n",st.name,st.age);
return 0;
}
1.1结构体的对齐
一个结构体变量成员总是以最大的那个元素作为对齐单位
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
struct A
{
char a1;
char a2;//如果不考虑a3,增加一个成员,下面输出a占用的内存增加一个字节
int a3;//这里a占用的内存为八字节,因为要以int对齐,总是以int为单位来变化
};//注意这里有;
struct B
{
char a1;
short a2;
char a4;//在这里放char的时候,short已经把内存占了,没地方放char了,所以结构体B占用总为12个字节。
int a3;//上边两个加起来没一个int大,所以,为八个字节,但是不知道short的位置
};
int main()
struct A a;
struct B b={
1,2,3};
printf("%u\n",sizeof(a));//输出a占用的内存为一个字节
printf("%p\n",&a);//在这里做一个断点,然后单步调试,选择调试,内存,查看内存内容
return 0;
图形说明上述程序:
对于structB
加了char a4的情况为:
此时,非常简单的优化方法是把a4和a3换个位置,减少内存浪费。
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
struct D
{
char a[10];
int b;//此时输出d的占用内存大小为16,可以肯定它没有按照char a[10]对齐,否则应该是十的倍数,其实它还是按照int对齐的,是4的倍数,如果结构体成员出现数组,那么是以数组的具体每个成员作为对齐标准。
//如果int b改成char b,那么这个结构体中的成员都是一种类型,那么这个结构变量在内存中就基本和一个数组类似。可以用char *s=&d;结构体本身是个变量,不能直接当数组名用,所以要取地址。甚至可以写成s[0]=1;s[10]=2;
};//注意这里有;
struct E
{
char a1;
short a2;//有一个字节被浪费了
int a3;
};
struct F
{
char a1;
short a2;
int a3;
short a4;
char a5;//此时,a1a2a3a4的内存位置都已知,a5是处于紧挨着short后面的下一个地址还是填充最后一个字节呢?结果是紧挨着的那个地址,最后一个字节是空的。
};
int main()
{
struct D d;
printf("%u\n",sizeof(d));
return 0;
printf("%p,%p\n",&d,d.a);//d.a是一个数组名,这里要弄清楚,这俩地址是一样的,结构体变量的地址,就是这个结构体首元素的地址
struct E e={