1.指针接收:
void *p可以接收任意类型的数据。
2.函数接口:
头文件<string.h>
memset(首元素地址,内容,从内存开始的长度); : 用来设置内存,通常用来清零。不关心指针类型
3.数组指针和指针数组
int *p [5]; p = &a;
int *arry[5] [5];
4.const关键字:
修饰只读变量, 只能在初始化时赋值,防止被修改。只控制修饰部分。
5.基本数据类型——布尔类型bool
头文件<stdbool.h>
bool类型只有true和false。
bool isjs = (?true:false)
6.构造数据类型(自定义数据类型)
结构体数据类型定义:
struct 结构体类型名 { 数据类型1 变量1; 数据类型2 变量2; 数据类型3 变量3; ...... }; | struct student { char name[32]; char sex; int age; float score; }; |
结构体里可以定义结构体,嵌套。
嵌套结构体:
struct 结构体类型名
{
struct 结构体类型名1
{
数据类型a 变量a;
数据类型b 变量b;
数据类型c 变量c;
.....
} 变量名1;
......
};
无名结构体不可以被引用。
struct A
{
struct A b;
int a;
};
struct A
{
struct A *p;
int a;
};
struct B;
struct A
{
struct B *p;
int i;
};
struct B
{
struct A *p;
float f;
};
结构体数据所占内存大小:
sizeof(struct student) = 44 ?????
结构体对齐原则:
内存分配的规律:
1.结构体成员变量分配在内存中的起始地址一定是自身基本数据类型整数倍的地址
2.结构体的大小必须是自身最大数据成员的整数倍
3.32位操作系统4字节对齐,64位操作系统8字节对齐
4.强制n字节对齐 #pragma pack(n)
关键字:typedef
定义一个类型别名,作用是标注和少打点字。
typedef 数据类型 类型别名_t;
定义指针: typedef int (*parry_t)[10];
parry_t p;
定义结构体:
typedef struct time
{
int hour;
int minute;
int second;
} tim_t;
结构体数据类型变量的初始化:
全部初始化
stu_t stu2 = {"zhangsan", 'J', 28, 59.9};
struct datetime dt0 = {{2023, 11, 8},{14, 23, 30}};
局部初始化
struct datetime dt1 = {
{
.year = 2023,
.day = 8
},
{
.hour = 14,
.sec = 30
}
};
结构体数据类型变量的访问:
"."结构体成员运算符,顾名思义,.变量名
"->" 箭头运算符( -> )的左边的操作数是一个指向结构体的指针。
相同点:两者都是二元操作符,而且右边的操作数都是成员的名称。
不同点:点运算符( . )的左边操作数是一个结果为结构的表达式;
结构体类型函数传参
直接传参
scanf("%s %c%d%f", pStu->name, &(pStu->sex......)
间接传参
i= 0;
scanf("%s %c%d%f", pStu[i].name, pStu[i].age......)