1.结构体 声明
2.typedef 提升levetypedef其实是为这个结构体起了一个新的名字,test4;
typedef struct test3 test4;
test4 相当于struct test3;
3.
typedef 的几种特殊方式
typedef int(*pfun) (int,int) //函数指针
typedef int (*p)[10] 数组指针
把typedef 先去掉 看是什么类型
tyepedef int ARR[10]
ARR arr
4.
def // const 起别名 字符替换
const int *p1 ;// const 修饰* 解引用 内容不可以变 地址可以边
int * const p2 ; //const 修饰 p2 . 内容可以变 地址不可以变
5. “*” 和后面的先结合
6.const * p
int * const p
7. . 运算符 和 - >
前面有指针,就用 ->
8. * 解引用 声明指针8.strcpy 的用法
9. 自引用
11.部分代码
1. 学生结构体变量 age name
2. strcpy () 在数组中 字符是一个一个保存的 所以需要改变字符串就要用strcpy
12.内存对齐
A.前面的地址必须是后面的地址的整数倍,不是就补齐B.整个struct的长度必须是最长字节的正数倍!~~
C.如程序中有#pragma pack(n)预编译指令,则所有成员对齐以n字节为准(即偏移量是n的整数倍),不再考虑当前类型以及最大结构体内类型
13.为什么要内存对齐
字节对齐主要是为了提高内存的访问效率,比如intel 32位cpu,每个总线周期都是从偶地址开始读取32位的内存数据,如果数据存放地址不是从偶数开始,则可能出现需要两个总线周期才能读取到想要的数据,因此需要在内存中存放数据时进行对齐。
代码部分:
// 定义一个结构体变量(年月日)计算该日是本年中的第几天 注意闰年问题
#include<stdio.h>
#include<string.h>
//#define PI 3
struct MyList1
{
int num ;
int age ;
char *name;
char sex[8];
};
typedef struct MyList2
{
int num ;
int age ;
char name[15];
char *sex;
}MyList2;
typedef struct MyList3
{
char *name;
int num;
}list;
void Show1(list *q4 ,int len ) //for循环
{
int i ;
for(i=0;i<len;i++)
{
printf("%2s %2d \n",q4[i].name,q4[i].num);
}
}
void Calculate1(int year,int month ,int day ) //不加结构体变量
{
int count;//
int i ;
count = day;
int arr[12]={31,28,31,30,31,30,31,31,30,31,30,31};
for(i=0;i<month-1;i++) //计算时候不包括本月的所有日期 只加上目前日期
{
count = count + arr[i];
}
if( ((year%4==0 && year%100!=0)||(year%400==0)) &&(month>2))
{
printf("This year is Leap Year \n");
printf ("And today is the %d year's %d day \n",year,count+1);
}
else
{
printf("This year is not Leap Year \n ");
printf("And today is the %d year's %d day \n",year,count);
}
}
struct Date
{
int year;
int month;
int day;
}date;
void Calculate2(int year,int month ,int day ) //不加结构体变量
{
int count;//
int i ;
count = day;
int arr[12]={31,28,31,30,31,30,31,31,30,31,30,31};
for(i=0;i<month-1;i++) //计算时候不包括本月的所有日期 只加上目前日期
{
count = count + arr[i];
}
if( ((year%4==0 && year%100!=0)||(year%400==0)) &&(month>2))
{
printf("This year is Leap Year \n");
printf ("And today is the %d year's %d day \n",date.year,count+1);
}
else
{
printf("This year is not Leap Year \n ");
printf("And toda is the %d year's %d day \n",date.year,count);
}
}
switch error
//void Calculate3(int year,int month ,int day ) //switch语句
//{
// switch (date.month)
// {case 1: day=date.day; break;
// case 2: day=date.day+3; break;
// case 3: day=date.day+59; break;
// case 4: day=date.day+90; break;
// case 5: day=date.day+120; break;
// case 6:day =date.day+151; break;
// case 7: day=date.day+181; break;
// case 8: day=date.day+212; break;
// case 9: day=date.day+243; break;
// case 10: day=date.day+273; break;
// case 11: day=date.day+304; break;
// case 12: day=date.day+334; break;
// break;
// }
// if ((date.year %4== 0 && date.year % 100 != 0 ||date.year % 400 == 0) && date.month >=3)
// {
// day+=1;
// printf("This year is Leap Year \n");
// printf ("And today is the %d year's %d day \n",date.year,date.day);
// }
// else
// {
// printf("This year is not Leap Year \n ");
// printf("And toda is the %d year's %d day \n",date.year,date.day);
// }
//}
//使用 . 运算符 和 -> 运算符
typedef struct A
{
char a;
int b;
struct A *pe;
}A;
typedef struct B
{
A a;
int b;
struct A * pc;
}B;
struct C //内存对齐
{
int c;
char a;//前面的地址必须是后面的地址的整数倍
short b;
};
int main()
{
//1.鲁班七号一般struct输出
struct MyList1 q1= {1,6,"LUBAN","nan"};
q1.name = "LUBAN7HAO";
printf("%d,%d,%s,%s\n",q1.num,q1.age,q1.name,q1.sex);
//2.鲁班七号typedef 输出 strcpy 曹孟德
MyList2 q2={2,9,"LUBAN7","NAN"};
q2.num = 4;
strcpy(q2.name,"caomengde");
printf("%d %d %s %s\n",q2.num,q2.age,q2.name,q2.sex);
list q4[4]= {{"luban1",100},{"luban2",99},{"luban3",94},{"luban6",92}};
//3.show 函数输出 王者荣耀 for 循环打印
int len = sizeof(q4)/sizeof(q4[0]);
Show1(q4,len);
// 4 define 替换
//printf ("%d\n",PI);
//5 计算日期 不加结构体变量
Calculate1(2008,3,15);
//6 计算日期 加结构体变量
Calculate1(2019,4,15);
error 7 计算日期 switch语句
//Calculate3(2016,4,5);
//8 使用 . 运算符 和 -> 指向符
B b;
b.a.a; //通过B 访问 A中的a
b.pc;//pc前面没有指针 用 .
b.a.pe;//pe 前面没有指针 用 .
b.pc->pe; // pe 前面有指针 pc 所以用 ->
printf ("the len is is %d ",sizeof(C));
getchar();
return 0;
}