C语言第十八次课
(1)续 结构体与数组
编写代码 要求打印学生数据:
编写为:用 . 访问时
用指向符-> 时:
(2)结构体的大小:研究结构体的对齐方式,以struct node开头;
注意:这里所表述的都是最大基本类型 ,只看是char double int一类的,而不是看数组个数或者组合类型来计算。
计算结构体变量大小时 默认从0开始,0可以整除任何数。
进行位置更改后,结构体变量大小也发生改变。
练习:
计算嵌套结构体变量的大小:
练习:
输出s1和s2的大小为多少?
如何计算偏移量的大小:利用 强转 成结构体指针
为什么要字节对齐:
#pragma pack(n) 指定对齐值:
(3)联合体 (共用体) 目的是:对同一个数据采取不同类型的识别;用union node表示;共享一段内存空间并且联合变量长度为各成员中最长的长度。
判断打印的值?
数据采用小端存放 高地址存放高字节 低地址存放低字节;从下往上=从高到底。
本体联合体中最长字节为2字节;则联合体变量的长度为2字节;x=2;sx=2;
按端存放后分别打印62和62,对应b和a的ASCII码值。
补充:类型对指针有两个约束:
1.约束其+1的能力;
2.解引用的能力;
判断以下程序是否能运行?
程序可以运行 但此时a和b不是上一题中的数组,a,b同时存放在一个字节当中,打印出的地址相同。b!=0,存放的是01,所以打印值为:d。
(4)哑元;(无名结构体)
struct后没有名字;
union Node
{
struct //哑元
char a;
char b;
};
注意:
对于内置类型不能定义为:int int ;(变量名不能是关键字)
但对于结构体可以定义为:struct Node Node;(自己设计的结构体 不是关键字)
typeof struct Node
{
char ar[2];
short sx;
};Node;//加了typeof后此时Node从结构体变量转换为类型。
注意:
struct
{
char ch[2];
short sx;
};x
struct
{
char ch[2];
short sx;
};y
//此处 x和y不是同种类型;不能进行彼此赋值 例如:x=y;不成立
此处x占8字节:
(5)三个函数的用法:sprintf_s;printf;fprintf;
scanf 返回正确接收数据的个数
int len = printf("a=%d b=%d \n",a,b)//返回其长度len
unsigned intStr_TO_Unit(char*stra)
{
assert(stra != nullptr);
IPNode x;
int s[4];
char ch;
int n = scanf_s(stra,"%d.%d.%d.%d%c,&s[3],s[2],s[1],s[0],ch)//核心代码
if(n != 4)return -1;
for (int i = 3;i>0;i++)
{
if(s[i]>=0&&s[i]<=255)
{
x.sx[i]=s[i];
}
else
{
printf("error \n");
return -1;
}
return x.addr;
}
}
int main()
{
char stra[]=("128.11.3.31")
char strb[]=("377.12.34")
char strc[]=("125.11.34.23.23.43")
unsigned int ip=Str_TO_Unit(stra);
printf("%u,\n,ip")
return 0;
}
//运行后为2148205343
(6)机器存放ip地址与 字符串和无符号整型之间的转换
举例:
每8个二进制转换成10进制表示。
整型转换成字符串
itoa:此函数可把整形转换成字符串:
程序如下:
简化其编程 用联合体来编写(共享空间)
//字符串转换成整型: str[ ]=>unsigned int
首先考虑怎么把125.11这种读出来
atoi函数可以把字符串转换成整型,但atoi遇到“ .” 就不转换了
p=strchr(p, ’ , ');用来查询点 “.”