当前位置: 首页 > wzjs >正文

婺城区建设局网站网页编辑格式

婺城区建设局网站,网页编辑格式,高德vr全景地图下载,查询建筑资质的网站一、动态分配内存 申请堆区的空间,需要手动申请,手动释放 如果直接定义在代码中的变量,是系统默认分配栈区的空间,栈区空间自动申请,生命周期结束自动释放。 需要用到头文件#include malloc和free一定成对出现 1.…


一、动态分配内存

申请堆区的空间,需要手动申请,手动释放

如果直接定义在代码中的变量,是系统默认分配栈区的空间,栈区空间自动申请,生命周期结束自动释放。

需要用到头文件#include

malloc和free一定成对出现

1.1 malloc

函数原型:
void *malloc(size_t size);   //有参数有返回值函数
功能:
从堆区申请size个字节,并将这一片空间的首地址返回给主调函数处
所以返回值为void*方便强转
void*表示万能指针(可以被强转成任何类型的指针)
使用:
int *p = (int*)malloc(sizeof(int));  //赋值运算符右侧的(int*)表示将malloc申请的首地址,强转成int类型
//让int*类型的指针p指向malloc申请的(sizeof(int))大小的堆区空间
//int *p = (int*)malloc(4);

1.2 free

功能:释放堆区的内存空间

函数原型:void free(void *ptr);
返回值:无
参数:要释放的堆区空间的首地址
堆区申请空间一定要使用free释放防止内存泄漏
一般释放完堆区内存后,会将原本指向堆空间的指针指向NULL

1.3 指针的强转

因为不同数据类型的指针的大小相同,所以指针之间的强转是安全的

但是会改变指针的偏移量

int *p; 
char *p1=(char*)p; 
上面的强转过程不会造成数据的丢失,但是如果p本身已经指向int类型数据,使用p1访问该数据时,可能只访问到低字节的数据

1.4 堆空间的地址作为指针函数的返回值

#include <stdio.h>
#include <stdlib.h>
int *func()
{int *p=(int*)malloc(4);*p=49;return p;
}
int main(int argc, const char *argv[])
{int *ret=func();  //因为func的返回值为堆空间申请的内存,不手动释放不会被回收    printf("%d\n",*ret);printf("%p\n",ret);//释放堆内存free(ret);return 0;
}

1.5 悬空指针

指针指向一片地址,但是对这片地址没有使用权,间接访问可能会发生段错误

1.5.1 指向已经堆放的空间

#include <stdio.h>
#include <stdlib.h>
int *func()
{int *p=(int*)malloc(4);*p=49;return p;
}
int main(int argc, const char *argv[])
{int *ret=func();  //因为func的返回值为堆空间申请的内存,不手动释放不会被回收    printf("%d\n",*ret);printf("%p\n",ret);//释放堆内存free(ret);printf("%p\n",ret);  //释放前后,ret的值不变//一般释放完堆区内存后,会将原本指向堆空间的指针指向NULLret=NULL;return 0;
}

1.5.2 指向已经被回收的空间

#include <stdio.h>
int *func()
{int a=90;int *p=&a;return p;   //这种方式返回编译不会报警告,因为智能识别到p是局部变量,返回p的值
}
int main(int argc, const char *argv[])
{int *ret=func();  //ret是一个悬空指针,指向已经被回收的栈空间的地址printf("%d\n",*ret);printf("%p\n",ret);return 0;
}

1.6 特殊指针

  1. 空指针:指向NULL的指针,间接访问一定会段错误
  2. 野指针:没有明确指向的指针,间接访问错误不可预知
  3. 悬空指针:指向已经被回收没有使用权的地址的指针,间接访问错误不可预知(知道指向,但是对空间没有使用权)
  4. 万能指针:可以强转为任意类型的指针

1.7 大小端存储

小端存储:低数据位存在低地址上

大端存储:低数据位存在高地址上

#include <stdio.h>
int main()
{int a = 0x12345678;char *p = &a;  //因为要取一个字节的数据进行判断//如果使用int *,*p取得是四个字节的内容if(*p==0x78){printf("小端存储\n");    }else if(*p=0x12){printf("大端存储\n");    }
}

1.8 练习

1.8.1 在堆区申请一个数组的空间,完成对数组元素的输入和输出

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{int *p=(int *)malloc(sizeof(int)*5);  // 申请一个客村下五个数的数组空间printf("请输入存入数组内的数(5)\n");for(int i=0;i<5;i++)  // 输入{scanf("%d",p+i);}printf("arr= ");for(int j=0;j<5;j++)  // 输出{printf("%d ",*(p+j));}free(p);  // 释放空间printf("\n");return 0;
}

二、结构体

属于构造数据类型

存储某些特征的结构,由多个或一个数据类型构成

2.1 定义

以学生为例,一个学生的信息包含:姓名、年龄、成绩、学校,这四个信息需要多个数据类型,数组无法完成,可以将这样的结构封装成结构体。

struct 结构体名
{//结构体成员数据类型 变量名;数据类型 变量名;····   
};   //定义了一个结构体类型

学生结构体的实现

#include <stdio.h>
//一般结构体的定义写在全局处
struct Stu
{int age;//年龄char name[100];//姓名float score;  //成绩
};
int main(int argc, const char *argv[])
{return 0;
}

2.2 定义结构体变量

struct 结构体名 结构体变量名;

2.3 初始化和赋值

2.3.1 完全初始化

定义的同时,按照结构体成员在结构体中的顺序完全初始化
struct Stu s2={20,"zhangsan",75.2}; 

2.3.2 不完全初始化

定义的同时,按照结构体成员在结构体中的顺序给部分成员赋值,未初始化的部分,默认为0
struct Stu s3={21};

2.3.3 按成员初始化

定义的同时,在初始化列标中以访问指定结构体成员的方式赋值
struct Stu s4={.name="lisi",.age=22};
#include <stdio.h>
#include <string.h>
//一般结构体的定义写在全局处
struct Stu
{int age;char name[100];float score;
}s;  //s是在定义结构体类型的同时,直接定义结构体变量int main(int argc, const char *argv[])
{struct Stu s1;   //定义了一个Stu类型的结构体变量s1/**************结构体的初始化和赋值*****************/struct Stu s2={20,"zhangsan",75.2};   //定义结构体变量,并完全初始化printf("s2.age=%d\n",s2.age);printf("s2.name=%s\n",s2.name);printf("s2.score=%f\n",s2.score);struct Stu s3={21}; //定义结构体变量不完全初始化,未初始化结构体成员默认为0printf("s3.age=%d\n",s3.age);printf("s3.name=%s\n",s3.name);printf("s3.score=%f\n",s3.score);//定义结构体变量,按照指定的顺序给某些/全部成员初始化struct Stu s4={.name="lisi",.age=22};printf("s4.age=%d\n",s4.age);printf("s4.name=%s\n",s4.name);printf("s4.score=%f\n",s4.score);/****************结构体变量的赋值******************/s1.age=18;    //单个成员的赋值,不能再进行整体赋值//s1.name="zhaoliu";//gets(s1.name);   用gets的方式给字符数组成员赋值strcpy(s1.name,"zhaoliu");s1.score=79.1;printf("s1.age=%d\n",s1.age);printf("s1.name=%s\n",s1.name);printf("s1.score=%f\n",s1.score);return 0;
}

2.4 访问结构体中的成员

通过.运算符访问结构体中的成员

  1. 结构体变量名.结构体成员名;
  2. 访问Stu中的name成员,已有结构体变量s1
  3. s1.name ---->获取到结构体变量s1中name成员的值

2.5 结构体指针访问结构体成员

struct 结构体名 *结构体指针名;
通过结构体指针访问结构体成员,用->访问
格式:结构体指针名->结构体成员;s1.age=18;    //单个成员的赋值,不能再进行整体赋值//s1.name="zhaoliu";//gets(s1.name);   用gets的方式给字符数组成员赋值strcpy(s1.name,"zhaoliu");s1.score=79.1;//定义结构体指针,指向s1struct Stu *p = &s1; printf("p->age=%d\n",p->age);printf("p->name=%s\n",p->name);printf("p->score=%f\n",p->score);

2.6 嵌套的结构体

#include <stdio.h>
struct Person
{int age;char name[100];
};
struct Stu
{struct Person p1;  //在Stu中嵌套Person类型的成员float score;
};
/*struct A
{//A里面包含了B类型结构体的定义struct B{int a;char c;};float b;
};*/
struct A
{//A里面包含了B类型的结构体成员b1struct B{int a;char c;}b1;float b;
};
//上面两种不同的结构体类型的定义都可以使用里面声明的struct B结构体类型
int main(int argc, const char *argv[])
{struct Stu s1;s1.p1.age = 90;printf("%d\n",s1.p1.age);struct B b2;return 0;
}

2.7 结构体的大小

结构体的大小需要进行字节对齐

字节对齐的规则:(通用的嵌套结构体也可以用)

  1. 每一个结构体中的成员对首地址的偏移量,必须是该成员本身对齐量的整数倍
  2. 成员本身的对齐量=成员本身对齐量>操作系统对齐量?操作系统的对齐量:成员本身大小(操作系统的对齐量,64位8Byte,32位4Byte)
  3. 结构体整体的大小,必须是最大对齐成员对齐量的整数倍
#include <stdio.h>
struct Person
{int age;char name[5];
};
struct Stu
{struct Person p1;  //在Stu中嵌套Person类型的成员float score;
};
/*struct A
{//A里面包含了B类型结构体的定义struct B{int a;char c;};float b;
};*/
struct Test
{char a;double k;int b;
};
struct A
{//A里面包含了B类型的结构体成员b1struct B{int a;char c;}b1;float b;
};
//上面两种不同的结构体类型的定义都可以使用里面声明的struct B结构体类型
int main(int argc, const char *argv[])
{struct Stu s1;s1.p1.age = 90;printf("%d\n",s1.p1.age);struct B b2;printf("%ld\n",sizeof(struct Person));printf("%ld\n",sizeof(struct A));return 0;
}

2.8 练习

2.8.1 从堆区申请一个结构体数组的空间,并完成对结构体成员的输入和输出

#include <stdio.h>
#include <stdlib.h>
struct Stu  // 定义一个结构体
{int age;char name[100];float score;
};
int main(int argc, const char *argv[])
{struct Stu *arr=(struct Stu*)malloc(sizeof(3));  // 从堆区申请一个储存三个结构体变量的空间for(int i=0;i<3;i++)  // 输入结构体内数据{printf("请输入学生姓名\n");scanf("%s",(arr+i)->name);printf("请输入学生年龄和分数\n");scanf("%d%f",&(arr+i)->age,&(arr+i)->score);}printf("姓名\t年龄\t分数\n");for(int j=0;j<3;j++)  // 输出结构体内数据{printf("%s\t%d\t%f\n",(arr+j)->name,(arr+j)->age,(arr+j)->score);}free(arr);  // 释放空间printf("\n");return 0;
}

2.8.2 计算下列结构体大小


文章转载自:

http://Ps1wkCM9.Ltzkk.cn
http://j8TIjLSI.Ltzkk.cn
http://iRpI1bDV.Ltzkk.cn
http://nqpqWUnE.Ltzkk.cn
http://VkBHnWuH.Ltzkk.cn
http://BhQZfSdO.Ltzkk.cn
http://tGCvu3qR.Ltzkk.cn
http://6nhoBe5D.Ltzkk.cn
http://yCLg1A6I.Ltzkk.cn
http://LNLe6fXP.Ltzkk.cn
http://hTjyg3o6.Ltzkk.cn
http://bh0ZafeS.Ltzkk.cn
http://UJaNfhYR.Ltzkk.cn
http://cnf1yP3C.Ltzkk.cn
http://rjs1hSg3.Ltzkk.cn
http://sIZse0YE.Ltzkk.cn
http://oGzKnWpK.Ltzkk.cn
http://s01ZW2N0.Ltzkk.cn
http://yBgkHYqV.Ltzkk.cn
http://Dffh7Ubw.Ltzkk.cn
http://FZbYLuvT.Ltzkk.cn
http://8BGYx9Xd.Ltzkk.cn
http://9wwsqQYT.Ltzkk.cn
http://P5BvZ1BG.Ltzkk.cn
http://7AHfiBXr.Ltzkk.cn
http://OH2dpxgI.Ltzkk.cn
http://R4dWL9AN.Ltzkk.cn
http://1gM5uZxK.Ltzkk.cn
http://hfTqdtFP.Ltzkk.cn
http://Kk06uUX1.Ltzkk.cn
http://www.dtcms.com/wzjs/669146.html

相关文章:

  • 哪个网站做线路攻略做得好动画片制作教程
  • 织梦做公司网站要钱吗html5简易网站建设
  • 网站建设有前途网站建设分为哪些内容
  • 上海网站制作哪家好网站建设和谷歌优化
  • 网站上传视频教程高端模板网站建设价格
  • 免费注册网站大全行业关键词
  • 公司网站建设哪个好免费手机网站制作
  • 网站建设案例wordpress毕业设计
  • 鹰潭做网站的长沙建站费用
  • 广东网站建设报价珠海网站建设尚古道策略
  • 建设文化产业网站的方案wordpress路由插件
  • 网站建设平台用乐云践新WordPress rss连接
  • 广州网站设计成功柚米科技怎么看网站到期时间
  • 目前做网站流行的语言重庆网站建站一站式服务
  • 郑州网站网络推广公司广州比较有名的网站建设公司
  • 网站开发模板专家数据库wordpress什么主题好
  • 跨境电商 网站开发域名领域
  • 五屏网站建设品牌好wordpress修改登录框字体
  • 网站界面设计起着决定性作用精品成品网站源码
  • 广州网站建设价格山东省城乡与住房建设厅网站
  • php网站开发的第三章wordpress花生壳lamp
  • 如何网站客户案例wordpress 汉化 不变
  • 公众号网站怎么做的网站seo排名优化方法
  • 上海网站建设高端网站里的动画效果图
  • 导视设计网站推荐wordpress改字体
  • 免费建站网站网页免费分站网站
  • 新手学做网站要学什么知识图文教程百度广告投放代理商
  • 网站建设中建站广告html单页面wordpress主题目录在哪里
  • 如何选择网站建设流程可以做语文阅读题的网站
  • 获取网站目录下所有文件银川做网站推广