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

这两个东西以前根本没有听说过,官网上是这样描述这两者的:

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的更多相关文章

  1. 【现代程序设计】homework-08

    1. 理解C++变量的作用域和生命周期 a) 用少于10行代码演示你对局部变量的生命周期的理解 #include <iostream>int main() { ; ;i<;i++); ...

  2. 现代程序设计 homework-08

    现代程序设计 homework-08 第八次作业. 理解C++变量的作用域和生命周期 作用域就是一个变量可以被引用的范围,如:全局作用域.文件作用域.局部作用域:而生命周期就是这个变量可以被引用的时间 ...

  3. homework-08

    这次作业是考察关于C++的一些使用,由于我的C++只掌握了基本功,所以我只有霸王硬上弓,勉强写写自己的浅见. 1. 理解C++变量的作用域和生命周期 对一个C++变量来说,有两个属性非常重要:作用域和 ...

  4. 【现代程序设计】【homework-08】

    1. 理解C++变量的作用域和生命周期 #include<stdio.h> char * test() { ]="; return s; } main() { puts(test ...

  5. 现代程序设计——homework-08

    写在前面 以下内容出自一个对C++只有一点点了解,几乎没有写过C++程序的人,理解上的一定会很不到位,请各位路过神牛多多指点. 博客内容为对 http://www.cnblogs.com/softwa ...

  6. homework-08 C++课程课后思考与练习

    经过上次晚交作业导致没分以后 我再也不敢晚交作业了 今天就把这次作业先写了 homework Part 1 1. 理解C++变量的作用域和生命周期 a) 用少于10行代码演示你对局部变量的生命周期的理 ...

  7. [课程相关]homework-08

    一.变量作用域和生命周期 #include <cstdlib> #include <iostream> using namespace std; void try_change ...

  8. 1028作业:Java语法基础

    //1.输入长与宽计算长方形面积与周长.(用精度类型计算) package com.lovo.J133; import java.util.Scanner; public class Homework ...

  9. 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 ...

随机推荐

  1. 使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务

    使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务 作者:Nikolay Manchev 分步构建一个跨这些平台的 ...

  2. C++ STL之deque的基本操作

    前两篇博文中已经介绍了vector和list的两种容器,我们发现他们各有各的优缺点,vector在内存中连续存储,支持随机访问,但是查找和删除的效率比较低,而list在内存中是链式存储的查找和删除的效 ...

  3. C++ STL之vector容器的基本操作

    注意事项:特别注意任何时候同时使用两个迭代器产生的将会是一个前闭后开的区间(具体见插入和删除的例子)特别注意begin()指向的是vec中的第0个元素,而end是指向最后一个元素的后面一个位置(不是最 ...

  4. sdut 1728 编辑距离问题( dp )

    题目 思路:edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离. 有如下动态规划公式: if i == 0 且 j == 0,edit(i, j) = 0 ...

  5. LA 3890 (半平面交) Most Distant Point from the Sea

    题意: 给出一个凸n边形,求多边形内部一点使得该点到边的最小距离最大. 分析: 最小值最大可以用二分. 多边形每条边的左边是一个半平面,将这n个半平面向左移动距离x,则将这个凸多边形缩小了.如果这n个 ...

  6. BZOJ_1629_[Usaco2007_Demo]_Cow_Acrobats_(贪心)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1629 \(n\)头牛叠罗汉.第\(i\)头牛的力量为\(s_i\),重量为\(w_i\),危险 ...

  7. Codeforces Round #271 (Div. 2)

    A. Keyboard 题意:一个人打字,可能会左偏一位,可能会右偏一位,给出一串字符,求它本来的串 和紫书的破损的键盘一样 #include<iostream> #include< ...

  8. 将多个.a库合并为一个.a库的方法

    如果编译了多个架构的静态库,想将它们合并为一个静态库的时候,可以用如下方法合并: sudo lipo -create /libs/ffmpeg/2.6.3/arm64/lib/libavcodec.a ...

  9. 图解VS2010打包全过程

    原文转自:http://blog.csdn.net/shan9liang/article/details/6957308 最近刚刚打包发布了用VS2010开发的一个收费系统,借此讲一讲打包过程,供大家 ...

  10. 【C#学习笔记】类型转换

    using System; namespace ConsoleApplication { class Program { static void Main(string[] args) { " ...