数组拾遗
数组运用的已经较为熟练了,但是还有些细节没注意。本文后面主要是字符串。
1.数组初始化初始化数组时,提供的值可以少于数组的元素数目。例如,下面的语句只初始化hotelTips的前两个元素:
1float hotelTips[5]={5.0,2.5};
如果只对数组的一部分进行初始化,则编译器将把其他元素设置为0。因此,将数组中所有的元素都初始化为0 非常简单—— 只要显式地将第一个元素初始化为0,然后让编译器将其他元素都初始化为0即可:
1long totals[500]={0};
如果初始化数组时方括号内([])为空,C++编译器将计算元素个数。例如,对于下面的声明:
1short things[]={1,5,3,8};
编译器将使things数组包含4 个元素。
2.C++11数组初始化方法C++11将使用大括号的初始化(列表初始化)作为一种通用初始化方式,可用于所有类型。数组以前就可使用列表初始化,但 C++11中的列表初始化新增了一些功能。
首先,初始化数组时,可省略等号(=):
1double ...
内存空间分配
在计算机总线一文中介绍了内存地址空间,现在说明在C++中如何进行内存分配。
一个C/C++的程序占用的内存分为以下几个部分:
1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等,操作方式类似与数据结构的栈。
2.堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS释放。
3.全局区(static):也叫静态数据内存空间,存储全局变量和静态变量,两个存在一起,但是已经初始化的放一起,没有初始化的放一起。程序结束后由系统释放。
4.文字常量区:常量字符串就是放在这,程序结束后由系统释放。
5.程序代码区:存放函数体的二进制代码。
但是还有的版本是1.2.3相同,4.5是自由存储区和常量存储区。
我查了整整一天,发现后面这种其实更符合官方文档。后文会再谈。我这先采用自己的视角探讨内存分配。
可执行程序的文件结构C程序我在Deepin中用gcc(6.2.0)编译一个hello程序,再用size命令查看其可执行程序的结构,如图:
可以看到,存储时(未加载到内存中)分为代码区(text),数据区(data),未初始化数据区(bss ...
指针探幽1
指针是个深坑,然而老师不教,只好自学。本篇主要是基础。
emmm,发现坑太深,我先补补前面的内容。
一.基础C++或者C里面最容易让人糊涂应该是指针了,不管是初学者甚至是有经验的童鞋有时候在用指针的时候也会出现一些很隐蔽的错误.指针本身就是一个很绕的概念,而指针又能够和很多的结构比如数组(二维数组),字符串,内存分配和管理等等一些联系起来变成更加绕的概念.所以基础不好的同学常常会犯一些很无厘头的错误,但是高手也会犯错误,而且更加隐蔽.接下来所有的文章内容并不能够保证你能够完完全全避免开发中的错误,但是文章的目标是帮助很多童鞋对于指针概念做一个系统性的归纳.减少犯错误的几率.或者是帮助刚刚入门的boy更加快速深入的理解指针,把基础打得扎实一点.恩,很多人都说指针很难,那为什么还要学指针呢?对于这样的问题,拒绝回答.
Ⅰ.内存和地址我们已经很熟悉一些基本的存储单位了,比如一个bit(位)用存储0或者1.也可以把几个bit合起来表示更大的数字,比如一个byte(字节)就包含了8个bit.这些都是很基础很简单的东西.然后我们可以把计算机的内存想象成一个字节数组,内存中的每一个地址表示一个字 ...
深入理解计算机系统读书笔记2
最近读《深入》一书遇到了非常多的问题,内容太杂较深,外国人的语言习惯也不一样,翻译过来的书翻译的怪怪的。所以读书进展很慢,我打算进度放缓,主攻《汇编语言》一书。
1.字
每台计算机都有一个字长,指明整数和指针的标称大小,同时字长也部分决定了虚拟地址空间的大小,如32位的80386CPU,其虚拟地址空间最大为4GB(2^32=4,294,967,296。4,294,967,296/1024/1024/1024=4GB,共有4,294,967,296个存储器单元地址,共4,294,967,296byte)。但是字长与地址总线没有对应关系。
2.数据大小
丢的文章中有篇写到了。。。
1234567891011121314151617181920212223242526272829303132#include <iostream>#include <climits>using namespace std;int main(){ int n_int = INT_MAX; short n_short = SHR ...
CPU的结构和寄存器
一个典型的CPU(此处讨论的不是某一具体的CPU)由运算器、控制器、寄存器(CPU工作原理)等器件构成,这些器件靠内部总线相连。前一章所说的总线,相对于CPU内部来说是外部总线。
内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系。简单地说,在 CPU中:
运算器进行信息处理;
寄存器进行信息存储;
控制器控制各种器件进行工作;
内部总线连接各种器件,在它们之间进行数据的传送。
《深入》一书中的结构如下图:
![新文档 2018-01-24_1](CPU的结构和寄存器\新文档 2018-01-24_1.jpg)
PC是指程序计数器,书中原话是“处理器的核心是一个字长的存储设备(或寄存器),称为程序计数器(PC)”,“寄存器文件是一个小的存储设备,由一些1字长的寄存器组成,每个寄存器都有唯一的名字”,“ALU计算新的数据和地址值”。???emm,恕我愚钝,看不懂,不知是翻译的锅,还是原作的锅,这段狗屁不通。
对于一个汇编程序员来说,CPU中的主要部件是寄存器。寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU ...
计算机总线
本篇谈谈总线及内存地址空间。
CPU对存储器(内存)的读写存储器被划分成多个存储单元,存储单元从零开始顺序编号。这些编号可以看作存储单元在存储器中的地址。就像一条街,每个房子都有门牌号码。C P U 要从内存中读数据,首先要指定存储单元的地址。也就是说它要先确定它要读取哪一个存储单元中的数据。就像在一条街上找人,先要确定他住在哪个房子里。另外,在一台微机中,不只有存储器这一种器件。CPU 在读写数据时还要指明,它要对哪一个器件进行操作,进行哪种操作,是从中读出数据,还是向里面写入数据。
可见,CPU 要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行下面3 类信息的交互。
存储单元的地址(地址信息);
器件的选择,读或写的命令(控制信息);
读或写的数据(数据信息)。
那么CPU 是通过什么将地址、数据和控制信息传到存储器芯片中的呢?电子计算机能处理、传输的信息都是电信号,电信号当然要用导线传送。在计算机中专门有连接CPU和其他芯片的导线,通常称为总线。总线从物理上来讲,就是一根根导线的集合。根据传送信息的不同,总线从逻辑上又分为3 类,地址总线、控制总线和数据 ...
stdafx.h的原理及作用
在使用VS的过程中经常会见到stdafx.h这个头文件,初学者常常因为这个放弃了对VS的使用,又回到了垃圾的VC6.0的怀抱。
stdafx的英文全称为Standard Application Framework Extensions(标准应用程序框架的扩展)。stdafx.h这个头文件的作用是实现头文件预编译,就是把一个工程(解决方案)中要使用的一些MFC标准头文件(如Windows.h、Afxwin.h)预先编译,以后该工程文件编译时,不再编译这部分,可以加快编译速度。
上图是解决方案的结构,可以看到stdafx.h和stdafx.cpp这两个东西,其内容是
12345678910111213141516// stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件//#pragma once#include "targetver.h"#include <stdio.h>#include <tchar.h>// TODO: 在此处引用程序需要的其他头文件
1234567 ...
深入理解计算机系统读书笔记1
前段时间把以前的随笔一不小心全都删了,很是痛心,有将近两个月没有动笔。现在到了寒假,深感不能浪费,于是又重拾笔头。内容主要包括读书笔记和补一些原来丢失的文章。
1.编译系统 以GCC为例,分为四个部分,预处理器,编译器,汇编器,链接器。对于其他的编译过程,基本上也就是这样的流程,只不过有的会划分为三个部分而已。
预处理器:主要处理‘#’标志的头文件,读取例如stdio.h的内容,插入到源文件中,生成扩展名为.i的文件。
#include指令:用于包含文件,包含后代码就可以正确的调用该文件中声明的变量和函数。有两种使用方式:#include <iostream.h>和#include “stdafx.h”。尖括号的将包含系统默认目录的头文件或尖括号内的路径查找。通常是系统中自带的公共头文件。我安装了Mingw,所以用gcc/g++编译时 ,用的是./Mingw/include中的头文件。而双引号包含头文件则在源代码所在目录查找,没有则到默认目录找,通常用于包含程序作者编写的私有头文件。stdafx.h就是微软家自己弄 ...