构造数据类型
数据类型
1.基本数据类型:short int long float double
2.构造数据类型:结构体、共用体(联合体)、枚举
结构体
结构体类型的定义
struct 结构体名
{
数据类型1 成员变量1;
数据类型2 成员变量2;
数据类型3 成员变量3;
...
};
如下,定义结构体名为student
struct student
{
int num;
int one;
int two;
int three;
int four;
int five;
};
结构体变量的定义
注意:变量类型为struct student!
struct student s[5] = {{1,59,60,57,62,63},
{2,60,61,62,63,64},
{3,61,59,63,64,58},
{4,90,91,92,93,94},
{5,85,86,87,88,89}};
结构体变量的初始化
1.全部初始化
2.局部初始化
结构体成员的访问
. :结构体变量类型访问成员变量
-> :结构体指针类型访问成员变量
for (i = 0; i < len; i++)
{
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);
}
结构体访问成员变量最终的类型由成员变量的类型决定
结构体的存储
内存对齐遵循以下原则:
1.存放结构体成员变量,必须保证前面的长度为成员变量所占空间大小的整数倍
2.结构体整体的大小必须为最大类型长度的整数倍
struct date
{
char a;
int year;
int mon;
int day;
}
如上结构体内存为12个字节!
结构体传参
无参
struct date Get (void)
{
struct date i;
scanf("%d%d%d",&i.year,&i.month,&i.day);
return i;
}
变量
int Put(struct date i)
{
printf("%d-%d-%d\n",i.year,i.month,i.day);
return 0;
}
指针
int GetDateByPoint(struct date *pd)
{
scanf("%d%d%d", &pd->year, &pd->mon, &pd->day);
return 0;
}
数组传参
int find(struct student *pstu,int len)
{
return 0;
}
共用体(联合体)
共用体(联合体)中的数据共享内存,即占内存最大的数据类型所占的字节
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;
}
运行结果为
重点:大端小端的判断
在共用体中,小字节的数据类型从最低的地址开始存储。大端小端是指不同的存储方式。大端是从数据的高位开始存储,存到低地址中,小端则相反。
方法一:
#if 0
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;
}
方法二:判断nums首地址的值
int main(void)
{
int num = 0;
num = 0x11223344;
if(*(char *)(&num) == 0x11)
printf("大端\n");
else if(*(char *)&num == 0x44)
printf("小端\n");
return 0;
}
枚举类型
enum weekyday
{
Monday = 1,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday,
};
1.枚举类型:
1.枚举常量第一个值默认为0,后面的枚举常量为前一个枚举常量的值+1
2.枚举类型对应的变量的值应该为枚举常量中的值之一
3.枚举常量可以让代码提高可读性
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;
}
运算符
位运算
1.& 按位与
2. | 按位或
3. ^ 按位异或 相同为0 相异为1
4. ~ 按位取反
5.<< 左移
6.>> 右移 让数据缩小 num /= 2 ^ n
1.1 不改变其余位的前提下,让第n位置1
int num: 1110 1011
num = num | (1 << n);
1.2不改变其余位的前提下,让第n位置0
int num:1110 1011
num = num & (~(1 << n));
^实现两个数的交换
int main(void)
{
int a = 100;
int b = 200;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d\nb = %d\n",a,b);
return 0;
}
运算符优先级:
括号 > 单目 > 双目 > 三目 > 赋值 > 逗号
双目:
算数 > 移位 > 关系 > 位运算 > 逻辑
目录
1.基本数据类型:short int long float double