- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
孙鑫VC教程之第03节指针和数组
第三节、数组与指针;一、一维数组与指针; p是一个char类型的指针,它里面放的是数组a的首地址,即a[0];a这里有双重含义:地址,也可以看作是常量指针;里面包含了10个char元素。在这种情况下,指针可以完成数组的操作,例如,对于数组的访问,可以用指针进行,也可以像数组一样对数组单元赋值和取址。但是数组不能看做普通指针,应该理解成一个固定的地址,她是在编译期间确定的,也可以理解成常量指针。?但是,由于数组名的双重含义,决定了他自己的特性,不信请看下面的程序: ;#include iostream
#include stdlib.h
using namespace std;
?int main(int argc, char *argv[])
?{??? int a[10]={1,2,3,4,5,6,7,8,9,10}, *p;??? p=a;
??? coutaendl;??? coutaendl;??? couta[0]endl;
coutpendl;??? coutpendl;??? coutp[0]endl;????
getchar();
return 0;
?}; 我们看到a, a , a[0]输出的结果都是一致的,他们都是数组的首地址,这里a体现的是指针的特性,a则体现了结构的特性。但是对于p来讲就不一样了,因为指针p在开始的时候开辟了一块自己的内存空间,经过p=a后,p里面放的是数组a的首地址,所以p和p[0]结果都是数组a的首地址,但是p则是指针p本身的内存地址。?
那么一维数组究竟是什么含义呢?; 实际上,一维数组应该理解成一个线性表,他在内存中开辟了一块连续的内存空间。在对数组访问的时候,实际上,编译器做了一定的转换工作:数组名(数组的起始地址)加上相对于起始地址的相对量(由下标变量给出),得到要访问的数组元素的单元地址,然后再对计算出的单元地址的内容进行访问。例如a[3]被转换成*(a+3)。 ; 由于数组是在编译期间确定,代表的是一块固定的内存空间,所以数组是不能够改变的,即a++,++a,a--,--a,a+=3,a-=3等都是不允许的,但是指针p做这些动作是毫无问题的。?
在win32系统下,任何类型的指针都占4个字节的内存空间。想想为什么?
答: 因为指针是是保存变量地址的变量,在win32下,32位地址,正好占用4字节宽。;二、数组越界; 对于上述代码,在line4结束时,i值为-1,而当line5结束时,i为0;原因是a[-1]所在单元恰好是i所在单元。而c++不对数组越界作检查,而是按偏移去寻址。
数组越界有时候还是一种攻击手段,例如:我们如果要修改一个对象的虚函数表指针,由于虚函数表指针保存在对象中,是一个const类型的指针。常规的办法无法修改,但是我们可以通过数组越界的方法来修改它。呵呵。正所谓技术是一把双刃剑,就看你怎么用了。;三、指针和堆的内存分配;在前面,我们曾经提到一个进程的用户区分为4个部分,
全局/静态区、代码区、堆区、栈区。
对于这四个区的数据,我们都可以通过指针进行间接访
问。在C++中,申请和释放堆中分配的存贮空间,分别使用
new和delete的两个运算符来完成:
格式: 指针类型 指针变量名=new 指针类型 (初始化);
delete 指针名; 例如:1、 int *p=new int(0); ? ? ? 它与下列代码序列大体等价: 2、int tmp=0, *p=tmp; 区别:p所指向的变量是由库操作符new()分配的,位于内存的堆区中,并且该对象未命名。 ;下面是关于new 操作的说明:
1、new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有名字。 2、一般定义变量和对象时要用标识符命名,称命名对象,而动态的称无名对象(请注意与栈区中的临时对象的区别,两者完全不同:生命期不同,操作方法不同,临时变量对程序员是透明的)。 3、堆区是不会在分配时做自动初始化的(包括清零),所以必须用初始化式(initializer)来显式初始化。new表达式的操作序列如下:从堆区分配对象,然后用括号中的值初始化该对象。 ;下面是从堆中申请数组 1、申请数组空间: 指针变量名=new 类型名[下标表达式]; 注意:“下标表达式”不是常量表达式,即它的值不必在编译时确定,可以在运行时确定。这就是堆的一个非常显著的特点,有的时候程序员本身
您可能关注的文档
最近下载
- 2024武汉城市职业学院教师招聘考试笔试试题.docx VIP
- 介入放射学考试题库及答案.pdf VIP
- 2023年浙江省杭州市钱塘区小升初语文试卷.docx
- 学习《中华人民共和国行政处罚法》党课PPT课件.pptx VIP
- GB_T 4074.5-2024绕组线试验方法 第5 部分电性能.docx VIP
- 2025年中国子宫颈癌筛查指南.docx VIP
- 装配整体式混凝土建筑施工总结.pptx VIP
- 班主任带班育人方略PPT课件.pptx VIP
- 泛血管疾病抗栓治疗中国专家共识2024版解读PPT课件.pptx VIP
- 2024年全国职业院校技能大赛(新材料智能生产与产品检验赛项)考试题库.docx VIP
文档评论(0)