1.结构体的存储:
struct date
{
char a;
int year;
int mon;
int day;
}
struct date d;
1.内存对齐:
1.存放结构体成员变量,必须保证前面的长度为成员变量所占空间大小的整数倍
2.结构体整体的大小必须为最大类型长度的整数倍
#include <stdio.h>
struct s
{
char a;
int b;
short c;
};
int main(void)
{
printf("%ld\n", sizeof(struct s));
return 0;
}
2.结构体传参:
struct date GetDate(void);
int PutDate(struct date d);
int GetDateByPoint(struct date *pd);
int PutDateByPoint(struct date *pd);
#include <stdio.h>
struct date
{
int year;
int mon;
int day;
};
int PrintDate(struct date tmp)
{
printf("%d-%d-%d\n", tmp.year, tmp.mon, tmp.day);
return 0;
}
struct date GetDate(void)
{
struct date tmp;
scanf("%d%d%d", &tmp.year, &tmp.mon, &tmp.day);
return tmp;
}
int GetDateByPoint(struct date *pd)
{
scanf("%d%d%d", &pd->year, &pd->mon, &pd->day);
return 0;
}
int PutDateByPoint(struct date *pd)
{
printf("%04d-%02d-%02d\n", pd->year, pd->mon, pd->day);
return 0;
}
int main(void)
{
struct date d;
// d = GetDate();
// PrintDate(d);
GetDateByPoint(&d);
PutDateByPoint(&d);
return 0;
}
3.结构体数组:
int PutAllStuInfo(struct student *pstu, int len);
#include <stdio.h>
struct student
{
char name[32];
char sex;
int age;
int score;
};
int PutAllStuInfo(struct student *pstu, int len)
{
int i = 0;
for (i = 0; i < len; i++)
{
#if 0
printf("姓名:%s\n", pstu[i].name);
printf("性别:%c\n", pstu[i].sex);
printf("年龄:%d\n", pstu[i].age);
printf("成绩:%d\n", pstu[i].score);
printf("姓名:%s\n", (pstu+i)->name);
printf("性别:%c\n", (pstu+i)->sex);
printf("年龄:%d\n", (pstu+i)->age);
printf("成绩:%d\n", (pstu+i)->score);
#endif
printf("姓名:%s\n", pstu->name);
printf("性别:%c\n", pstu->sex);
printf("年龄:%d\n", pstu->age);
printf("成绩:%d\n", pstu->score);
pstu++;
}
return 0;
}
int GetAllStuInfo(struct student *pstu, int len)
{
int i = 0;
for (i = 0; i < len; i++)
{
gets(pstu[i].name);
scanf("%c", &pstu[i].sex);
scanf("%d", &pstu[i].age);
scanf("%d", &pstu[i].score);
getchar();
}
return 0;
}
int main(void)
{
struct student s[3];
GetAllStuInfo(s, 3);
PutAllStuInfo(s, 3);
return 0;
}
1.共用体:
也称为联合体
#include <stdio.h>
union s
{
char a;
short b;
int c;
};
int main(void)
{
union s s1;
s1.a = 'A';
s1.b = 200;
s1.c = 1000000;
printf("%c\n", s1.a);
printf("%d\n", s1.b);
printf("%d\n", s1.c);
return 0;
}
2.测试一个硬件平台是大端平台?小端平台?
1.小端:内存低地址存放低数据位称为内存小端
2.大端:内存低地址存放高数据位称为内存大端
#include <stdio.h>
int main(void)
{
int num = 0x11223344;
if (0x44 == *(char *)&num)
{
printf("小端!\n");
}
else if (0x11 == *(char *)&num)
{
printf("大端!\n");
}
return 0;
}
#include <stdio.h>
union s
{
char a;
int b;
};
int main(void)
{
union s s1;
s1.b = 1;
if (s1.a)
{
printf("小端!\n");
}
else
{
printf("大端!\n");
}
return 0;
}
1.枚举类型:
1.枚举常量第一个值默认为0,后面的枚举常量为前一个枚举常量的值+1
2.枚举类型对应的变量的值应该为枚举常量中的值之一
3.枚举常量可以让代码提高可读性
#include <stdio.h>
enum weekyday
{
Monday = 1,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday,
};
int main(void)
{
enum weekyday day;
scanf("%d", (int *)&day);
if (Monday == day)
{
printf("尾号为1和6限行\n");
}
else if (Tuesday == day)
{
printf("尾号为2和7限行\n");
}
else if (Wednesday == day)
{
printf("尾号为3和8限行\n");
}
else if (Thursday == day)
{
printf("尾号为4和9限行\n");
}
else if (Friday == day)
{
printf("尾号为0和5限行\n");
}
return 0;
}
位运算:
& 按位与
| 按位或
^ 按位异或 相同为0 相异为1
~ 按位取反
<< 左移
>> 右移 让数据缩小 num /= 2 ^ n
& 0得0
| 1置1
不改变其余位的前提下,让第n位置1
int num: 1110 1011
num = num | (1 << n);
不改变其余位的前提下,让第n位置0
int num:1110 1011
num = num & (~(1 << n));
^实现两个数的交换
#include <stdio.h>
int main(void)
{
int num = 0;
num = 9 & 3;
num = 9 | 3;
num = 9 ^ 3;
num = ~9;
num = 9 >> 2;
num = 9 << 2;
printf("num = %d\n", num);
return 0;
}
进行数据置换:
#include <stdio.h>
int main(void)
{
int a = 100;
int b = 200;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d, b = %d\n", a, b);
return 0;
}
运算符优先级:
括号 > 单目 > 双目 > 三目 > 赋值 > 逗号
双目:
算数 > 移位 > 关系 > 位运算 > 逻辑