知识点3【结构体变量的初始化】
知识点4【结构体变量获取键盘输入】
运行结果:
知识点5【结构体变量间的赋值】
运行结果:
struct stu tmp;交换俩个结构体变量
tmp = lucy;
lucy = bob;
bob = tmp;
知识点6【结构体数组】
//需求:定义一个结构体数组 有5个元素 获取键盘输入 求取平均年龄
void test07()
{
struct stu arr[5];
memset(arr, 0,sizeof(arr));
int n = sizeof(arr)/sizeof(arr[0]);
//获取键盘输入
printf("请输入%d个学生的信息num name age\n",n);
int i=0;
for ( i = 0; i < n; i++)
{
scanf("%d %s %d", &arr[i].num, arr[i].name, &arr[i].age);
}
//统计总年龄
int sum = 0;
for ( i = 0; i < n; i++)
{
sum += arr[i].age;
}
printf("平均年龄为:%d\n",sum/n);
//按年龄 排序 冒泡排
for (size_t i = 0; i < n-1; i++)
{
for (size_t j = 0; j < n-i-1; j++)
{
if(arr[j].age > arr[j+1].age)//交换
{
struct stu tmp;
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1]=tmp;
}
}
}
printf("--------------\n");
for (i = 0; i < n; i++)
{
printf("num=%d, name=%s, age=%d\n", \
arr[i].num, arr[i].name, arr[i].age);
}
}
运行结果:
知识点7【typedef】typedef 给已有的类型 取个别名。
typedef 不能创造 新的类型。
案例:给数组取个别名
案例:给函数指针 取个别名
案例:给结构体取个别名
知识点8【结构体指针】
typedef struct stu
{
int num;
char name[32];
float score;
}STU,*STU_P;
//STU就是struct stu的类型
//STU_P就是struct stu *的类型
void test04()
{
STU lucy={100, "lucy", 99.9f};
//STU_P p=&lucy;
STU *p = &lucy;
printf("num = %d,name=%s,score=%f\n", lucy.num, lucy.name,lucy.score );
//*p = *&lucy=lucy
printf("num = %d,name=%s,score=%f\n", (*p).num, (*p).name,(*p).score );
//直接通过p访问lucy成员
printf("num = %d,name=%s,score=%f\n", p->num, p->name, p->score );
//如果.或->左边 是变量 就用. 如果是地址就用->
printf("num = %d,name=%s,score=%f\n", (&lucy)->num, (&lucy)->name, (&lucy)->score );
}
运行结果:
案例:堆区申请结构体空间
知识点9【结构体指针作为函数的参数】
知识点10【函数内部操作外部数组】
typedef struct stu
{
int num;
char name[32];
float score;
}STU,*STU_P;
STU* getSTUArray(int n)
{
return (STU *)calloc(n,sizeof(STU));
}
void myInputSTUArray(STU *arr, int n)
{
int i=0;
for(;i < n; i++)
{
printf("请输入第%d个学生的信息:",i+1);
//scanf("%d %s %f", &arr[i].num, arr[i].name, &arr[i].score );
scanf("%d %s %f", &(arr+i)->num, (arr+i)->name, &(arr+i)->score );
}
return;
}
void myPrintSTUArray(STU *arr, int n)
{
int i=0;
for(i = 0; i < n; i++)
{
printf("num=%d,name=%s,score=%f\n", (arr+i)->num, (arr+i)->name, (arr+i)->score );
}
return;
}
void test07()
{
STU *arr = NULL;
int n = 0;
printf("请输入学生的个数:");
scanf("%d", &n);
//根据学生的个数 从堆区申请结构体数组空间
arr = getSTUArray(n);
//获取键盘输入
myInputSTUArray(arr, n);
//遍历结构体数组
myPrintSTUArray(arr, n);
//释放空间
if(arr != NULL)
{
free(arr);
arr=NULL;
}
}
int main(int argc, char const *argv[])
{
test07();
return 0;
}
运行结果:
知识点11【结构体对齐问题】
步骤:
1、确定分配单位:每一行应该分配的字节数,由结构体中最大的基本类型的大小决定。
2、确定每个成员的起始位置的偏移量 = 成员的基本类型的整数(0~n)倍
3、收尾工作:结构体的总大小 == 分配单位的整数倍。
案例:
结构体嵌套结构体:
typedef struct
{
int x;
int y;
}DATA3;
typedef struct
{
int a;
int b;
DATA3 c;//结构体嵌套结构体
}DATA4;
void test03()
{
//结构体嵌套结构体:访问到最底层
DATA4 data;
data.a = 10;
data.b = 20;
data.c.x = 30;
## 学习路线:
这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
![在这里插入图片描述](https://img-blog.csdnimg.cn/7a04c5d629f1415a9e35662316578e07.png#pic_center)
详情docs.qq.com/doc/DSlhRRFFyU2pVZGhS