博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小记2
阅读量:5128 次
发布时间:2019-06-13

本文共 1376 字,大约阅读时间需要 4 分钟。

在代码里直接出现的”abcdef”这种字符串,在程序执行的时候,系统会将它们放在常量区,所谓常量区就是一直存在的,只读的,不可更改的数据区域,并且一个字符串只会有一份。假设你在程序里有两行代码 char* p1 = “agcd” ; char* p2 = “agcd” ;  无论你这两个行代码隔了多远,如果你想知道p1和p2所指向的字符串在内存中是不是同一个,那答案是肯定的,p1和p2的值完全一样。”agcd”这是一个存在于内存中的常量字符串,它从程序一开始就在那里,一直到程序结束读不会改变。在内存中,”agcd”是以如下方式存储的 ‘a’ ’g’ ‘c’ ‘d’ ‘\0’ 它的最后肯定有一个字符串结束标志’\0’。在种字符串的名字叫“以空字符为结束标志的字符串”。 char* p1 = “agcd” ; 如果你这时候想改变第一个字符的值,用p[0] =’b’,系统会报一个错,常量字符不能更改

如果你定义一个char a[10],那么系统会“只分配”10个char这么长的内存区域,一个char是一个字节,那么系统会分配十个字节的内存控件,并且将这一片连续的内存空间的首地址赋值给a。也就是说“数组名的值是数组所在内存区域的首地址”换句话说“数组名是一个指针,指向数组第一个值的地址”。 如果你定义一个char a[] = “abcdefg”;这句代码就复杂点了。定义一个数组,数组长度未知,那么系统会根据等号后面的值来“初始化”这个数组,等号后面是什么?前面说过,它是一个常量字符串。在内存中占8个字节,7个字符加上一个结束标志。这时候在内存中就有两个”abcdefg”的字符串了,一个是常量区域的,另一个是根据前者复制了一份的。这句代码的意思就是复制一个常量区域的字符串,将复制后的字符串的首字母的地址赋值给a。 也就是说,最后a所指向的内存区域,已经不是常量里的”abcdefg”了,这里为什么要复制一份呢?原因是因为常量是不允许更改的,而数组一般都意味着需要修改,所以就复制了一份数据,放在非常量区域,就可以更改了。

比如从文件里读一段文字出来,假设当前文件中的字符串有20个字母。 第一步读取文件大小。 int fileSize = file.getSize(); 第二步,分配缓存。这是动态分配数组。这种用法和java相似。 char* p = new char[fileSize+1] ;//加1是为了后面放’\0’. 第三步,读取 file.read(p,fileSize);//意思是从文件里读取filesize个字节,并且放在p所指向的缓存中 第四步,标志结尾 P[fileSize] = ‘\0’; //由于指针指向的是字符串首字母地址,而数组名也是一样的,所以C/C++里指针和数组几乎用法一样。其他语言里不一样。这也是C/C++的魅力所在,够灵活。

也就是说读取文件的本质是在内存中对文件进行了一次拷贝,如果读取大量数据的时候,只对文件进行点修改,还是会进行拷贝,这样就大大降低了效率,想到了对数据进行分块儿,每次拷贝只对有修改的数据块儿进行复制。

受教了 感谢 脱壳的金蛋 

转载于:https://www.cnblogs.com/RenderLife/archive/2012/10/09/2716901.html

你可能感兴趣的文章
CentOS 7 yum安装失败问题
查看>>
ArcGIS移动开发策略的选择[转]
查看>>
LoadRunner参数化详解
查看>>
P1985 翻转棋
查看>>
python_day1
查看>>
PowerDesigner中CDM数据类型和PDM数据类型间的mapping (对应关系)详解
查看>>
如何解决…has been modified since the precompiled header… was built的问题
查看>>
找出现有Vector或ArrayList或数组中重复的元素&给现有Vector或ArrayList或数组去重
查看>>
js检测对象的类型
查看>>
使用Emacs:生存篇
查看>>
Java模拟按键
查看>>
py-faster-rcnn之python引入_caffe.so
查看>>
在gridview的rowcommand事件中取模板列中控件的值
查看>>
框架技术----Spring
查看>>
24@Servlet_day04
查看>>
hdu 6185 递推+【矩阵快速幂】
查看>>
HTTP状态码详解【转】
查看>>
linux系统中whereis的用法详解
查看>>
Codeforces Round #431 (Div. 2) B. Tell Your World 题解
查看>>
关于SAE上Django配置
查看>>