结构体的学习
一、结构体。
(1)定义结构体和变量:struct student{
int num;
char name[20];
float score[3];
}stu1;
struct stu2,stu3[2] = {1000,”zhangsan”,70,80,90,1001,”lisi”,57,58,59};
(2)给结构体中字符数组赋值:strcpy(stu1.name,”zhangsan”);
(3)结构体成员的三种表示方法:struct student stu1, * ptr;
stu1.num = 1001;
ptr->num = 1002;
(* ptr).num = 1003;
(4)内存的计算:(结构体内存以四个字节对齐)
例一:(1)中的结构体所占空间36个字节。
例二:#include <stdio.h>
typedef struct
{
int aa1; //4个字节对齐 1111
char bb1 ; //1个字节对齐 1
short cc1; //2个字节对齐 011
char dd1; //1个字节对齐 1
} testlength1;
int length1 = sizeof(testlength1); //4个字节对齐,占用字节11111011 1000,length = 12
例三:#include <stdio.h>
typedef struct
{
int aa1; //4个字节对齐 1111
char bb1 ; //1个字节对齐 1
short cc1; //2个字节对齐 011
char dd1; //1个字节对齐 1
} testlength1;
int length1 = sizeof(testlength1); //4个字节对齐,占用字节11111011 1000,length = 12
二、联合的使用:(共用同一内存,所占内存以最大字节算)
union data{
intdata;
char c;
double f;
}
union data s1;
len = sizeof(s1);---------len = 8;从第一个地址开始,以最大字节为算。
#pragma pack(n)-----以n字节对齐
三、typedef的用法:typedef 原有类型名 新类型名
(1) typedef int NUM[100];(二维数组同理)
NUM a---------int a[100]
(2) typedef char* STRING;
STRING str------char* str
(3) typedef int (* POINT) (int);
POINT f---------int (* f) (int)
(4) typedef unsigned char uchar;
uchar a---------unsigned char a
(5) typedef int* NUM[3];
NUM a---------int* a[3]
(6) tyrpdef struct Node{
int data;
struct Node* ptr;
}PNode;
PNode N1;
----struct Node {
int data;
PNode* ptr;
};
四、volatile:它所修饰的变量会改变,提醒编译器每次都到内存中取值。
五、大端模式和小端模式
大端模式:高位数据放在低地址;低位数据放在高地址。
小端模式:低位数据放在低地址;高位数据放在高地址。
例题:
#include <stdio.h>
union data{
char a[4];
inti;
};
int main()
{
union data s1;
s1.a[0] = 0x78;
s1.a[1] = 0x56;
s1.a[2] = 0x34;
s1.a[3] = 0x12;
printf("s1 = %x\n", s1.i);
return 0;
}
结果:s1 = 12345678
高地址-------------低地址。
s1.a[0]是低地址,输出结果78也放在低地址位置,所以为小端模式。