homework08
1.局部变量生命周期
#include "iostream.h" void add1(int i){i = i + ;} int main()
{
int n = ;
add1(n); cout << n << endl;//输出结果为1,n的值并没有被改变
return ;
}
就像上面说的,局部变量只存活于函数内部,所以add1函数并不能改变n的值。
2.对于堆和栈内存申请方式,之前并不清楚这是个什么概念,在查过后发现下面这样的内容:
堆和栈的区别:
1、申请和响应不同:
(1)申请方式:
stack由系统自动分配,系统收回;heap需要程序员自己申请,C中用函数malloc分配空间,用free释放,C++用new分配,用delete释放。
(2)申请后系统的响应:
栈:只要栈的剩余空间大于所申请的空间,体统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请的空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete或free语句就能够正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会将多余的那部分重新放入空闲链表中。
2、申请的大小限制不同:
栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域,这是由于系统是由链表在存储空闲内存地址,自然堆就是不连续的内存区域,且链表的遍历也是从低地址向高地址遍历的,堆得大小受限于计算机系统的有效虚拟内存空间,由此空间,堆获得的空间比较灵活,也比较大。
3、申请的效率不同:
栈:栈由系统自动分配,速度快,但是程序员无法控制。
堆:堆是有程序员自己分配,速度较慢,容易产生碎片,不过用起来方便。
4、堆和栈的存储内容不同:
栈:在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是函数的各个参数,在大多数的C编译器中,参数是从右往左入栈的,当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令。
堆:一般是在堆得头部用一个字节存放堆得大小,具体内容由程序员安排
这样的话,堆和栈的申请方式代码就是:
#include "iostream.h" int main()
{
int n = ;//栈
int *m = new int ();//堆
cout << n << ' ' << *m << endl;
return ;
}
3.unique_ptr和shared_ptr
这两个东西以前根本没有听说过,官网上是这样描述这两者的:
A unique_ptr不会共享它的指针。 无法将它复制到另一个unique_ptr,(除非它是可修改 rvalue) 通过值传递给函数,或需要对其进行复制的任何标准模板库 (STL) 算法中使用。 A unique_ptr只能移动。 这意味着内存资源的所有权将转移到新的unique_ptr和原始unique_ptr不再拥有它。 我们建议您将一个对象限制为一个所有者,因为拥有多个程序逻辑增加复杂性。 因此,当您需要为普通的 C++ 对象的智能指针,使用unique_ptr。
shared_ptr 类型是智能指针在为方案设计多个所有者可能必须管理对象生存期内存中的 C++ 标准库中。 在初始化可以将它复制的 shared_ptr 后,将它在函数参数的值,并将其分配给其他 shared_ptr 实例。 所有实例指向同一对象,并且,对“的共享访问控制块”该引用计数的增量和减量,每当新shared_ptr 添加,超出范围或重新设置。 当引用计数达到零时,控制块删除内存资源和自身。
说实话,看不太懂,只能简单的理解一下,unique_ptr指向的位置不能同时被另一个指针所指,在有新的指针指向同一位置的时候,之前的指针将会置空;而对于shared_ptr则没有这么强的要求,可以多个指针指向同一个位置,此外,shared_ptr内还有一个计数器,对指向被指向位置的指针数目进行统计,实时改变。其余的内容就不是很懂了。
4.url分割
其实不是很明白C++11风格是什么,或者说不知道我用的风格是什么,所以只写这一段代码。查了一下STL的意思,看了看,好像不太懂,也就没敢用。
#include "iostream"
#include "string"
using namespace std; int main()
{
char in[];
char token[];
int i = ;
memset(in , ,);
memset(token , ,); while(true){
cout << "input:" ;
cin >> in ; for(i = ; i < ; i++)
token[i] = in[i];
if(strcmp(token , "http://") == ){//url合法性检测,以下类似
i = ;//双斜杠后起始位置
cout << "output:" ;
cout << "http,";
break;
}
else if(strcmp(token , "site://") == ){
i = ;
cout << "output:" ;
cout << "site,";
break;
}
else if(strcmp(token , "ftp://") == ){
i = ;
cout << "output:" ;
cout << "ftp,";
break;
}
else cout << "Input error!" << endl;//错误提示并重新输入
} while (true)
{
if(in[i] == '\0')break;//结束标志
if(in[i] == '/' ||in[i] == '.'){//分割标志
cout << "," ;
i++;
continue;
}
while(in[i] != '/' && in[i] != '.' && in[i] != '\0')cout << in[i++];//单词输出
continue;
}
cout << endl;
return ;
}
办法似乎很笨,但是很简单。
homework08的更多相关文章
- 【现代程序设计】homework-08
1. 理解C++变量的作用域和生命周期 a) 用少于10行代码演示你对局部变量的生命周期的理解 #include <iostream>int main() { ; ;i<;i++); ...
- 现代程序设计 homework-08
现代程序设计 homework-08 第八次作业. 理解C++变量的作用域和生命周期 作用域就是一个变量可以被引用的范围,如:全局作用域.文件作用域.局部作用域:而生命周期就是这个变量可以被引用的时间 ...
- homework-08
这次作业是考察关于C++的一些使用,由于我的C++只掌握了基本功,所以我只有霸王硬上弓,勉强写写自己的浅见. 1. 理解C++变量的作用域和生命周期 对一个C++变量来说,有两个属性非常重要:作用域和 ...
- 【现代程序设计】【homework-08】
1. 理解C++变量的作用域和生命周期 #include<stdio.h> char * test() { ]="; return s; } main() { puts(test ...
- 现代程序设计——homework-08
写在前面 以下内容出自一个对C++只有一点点了解,几乎没有写过C++程序的人,理解上的一定会很不到位,请各位路过神牛多多指点. 博客内容为对 http://www.cnblogs.com/softwa ...
- homework-08 C++课程课后思考与练习
经过上次晚交作业导致没分以后 我再也不敢晚交作业了 今天就把这次作业先写了 homework Part 1 1. 理解C++变量的作用域和生命周期 a) 用少于10行代码演示你对局部变量的生命周期的理 ...
- [课程相关]homework-08
一.变量作用域和生命周期 #include <cstdlib> #include <iostream> using namespace std; void try_change ...
- 1028作业:Java语法基础
//1.输入长与宽计算长方形面积与周长.(用精度类型计算) package com.lovo.J133; import java.util.Scanner; public class Homework ...
- java基础编程练习
1.编写程序实现对给定的 4 个整数从大到小的顺序排列. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
随机推荐
- git全局配置
使用git的童鞋都知道,git是非常好的版本管理工具,工具再好要想用的得心应手还是要下凡功夫的,比如可以通过对git的全局配置文件.gitconfig进行适当的配置,可以在日常项目开发中节省很多的时间 ...
- cas单点登出
由于项目需求要实现单点登出需要在网上找了N久终于实现单点登出. 使用cas-server-core-3.3.3.jar(CAS Server 3.3.3) 使用cas-client-core-3.1. ...
- ubuntu下安装Ming的教程
Ming是一个操纵swf(flash movice)的C库,支持php. ruby. python等语言. 重要提示: 在安装Ming之前,应该准备好你的系统,特别是Linux/Unix系统,如果你对 ...
- gsp序列模式挖掘
数据挖掘进阶之序列模式挖掘GSP算法 绪 继续数据挖掘方面算法的讲解,前面讲解了数据挖掘中关联规则算法FP-Growth的实现.此篇博文主要讲解基于有趣性度量标准的GSP序列模式挖掘算法.有关论文后期 ...
- CocoaPods requires your terminal to be using UTF-8 encoding
WARNING: CocoaPods requires your terminal to be using UTF-8 encoding. See https://github.com/CocoaPo ...
- ScaleGestureDetector缩放view
public class ScaleGesture implements OnScaleGestureListener { private float beforeFactor; private fl ...
- Android中shape中的属性大全
---恢复内容开始--- <shape> <!-- 实心 --> <solid android:color="#ff9d77"/> <!- ...
- VB程序逆向反汇编常见的函数
VB程序逆向常用的函数 1) 数据类型转换: a) __vbaI2Str 将一个字符串转为8 位(1个字节)的数值形式(范围在 0 至 255 之间) 或2 个字节的数值形式(范围在 -32,7 ...
- 配置ORACLE 客户端连接到数据库
--================================= -- 配置ORACLE 客户端连接到数据库 --================================= Oracle ...
- JS触发ASP.NET服务器端控件的方法
<asp:Button ID="Button_regId" runat="server" Font-Bold="False" OnCl ...