欢迎来到天天文库
浏览记录
ID:53298595
大小:77.00 KB
页数:4页
时间:2020-04-03
《浅析cc++中的指针.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、一、我们先来回忆一下指针的概念吧,方便下面的介绍指针是存放地址值的变最或者常最。例如:intai;&a就表示指针常量(“&”表示取地址运算符,也即引用)。int*b,b表示的是指针变量(注意,是b表示指针变量而不是F),少表示要说明的是指针变量。大家注意int*b[2]和int(F)[2]是不同的,int*b[2]表示一个指针数组,Mint(F)[2]表示含有两个元素的int指针,这里要注意运算优先级问题,有助于理解指针问题。在这里大概介绍基本概念就够了,至于具体使用方法,如赋值等,很多书都有介绍,我就不多说了。二、应用以及注意的问题1、理解指针的关键所在——对指针类型和指针所指向的类型
2、的理解%1、指针类型:可以把指针名字去掉,剩下的就是这个指针例如:int*a;//指针类型为int*int**a;〃指针类型为int**int*(*a)[8];〃指针类型为int*(*)[8]%1、指针所指向的类型:是指编译器将把那一片内存所看待成的类型。这里只要把指针声明语句屮的指针名字和名字右边的心号去掉就可以了,剩下的就是指针所指向的类型。我Z所以把他们放在第一位,是因为弄清楚他们是学C/C++指针的重点,正确理解他们才能使你打好C/C++的编程基础。2、指针的应用——传递参数。其实它可以相当于隐式的返冋值,这就比return的方法更加灵活了,可以返冋更多的值,看看下血的例了自然就
3、明白了:#inelude"iostream.h"voidexample(int*a1,int&b1,intc1){*a1*=3;++b1;++c1;}voidmain(){int*a;intb,c;*a=6;b=7;c=10;example(a,b,c);cout«H*a="«*a4、指针來理解,所以b的值会改变。函数屮的参数intel只是在函数屮起作用,当函数结束时候便消失了,所以在main()屮不起作用3、关于全局变量和局部变量的一个问题先不废话了,先看看程序:#include“iostream.h”inta=5;int*example1(intb){a+=b;return&a;}int*example2(intb){intc=5;b+=c;return&b;}voidmain(){int*a1=example1(10);int*b1=example2(10);cout«"a1=n«*a15、么会是4135,而不是15呢?是程序的问题?没错吧?由于a是全局变量,存放在全局变量的内存区,它一直是存在的;而局部变量则是存在于函数的栈区,当函数example2()调用结朿后便消失,是b指向了一个不确定的区域,产生指针悬挂。下面是对examplei()和example2()的反汇编(用TC++3.0编译):examplei():pushbp;movbp,spmovaxJbp+04];add[OOAA],ax;movax,OOAA;movax,[bp-02];add[bp+04],ax;leaaxJbp+O4];传递参数相加问题就出在这里入栈传递参数相加返冋了结果所在的地址popbp;6、恢复栈,出栈ret;退岀函数example2():pushbp;入栈movbp,spsubsp,02movwordptr[bp-02],0005movsp,bppopbp;恢复栈,出栈ret;退岀函数对比之后看出来了吧?ax应该是存储的是结果的地址。而在example2()中,返回的却是[bp+04]的内容,因此指针指向了一个不确定的地方,由此产生的指针悬挂。examplei()中,ax返回了正确的结果的地址。4、内存问题:使用指针注意内存的分配和边界。使川指针过程屮应该给变量一个适当的空间,以免产生不可见的错谋。请看以下代码:#include7、){char*a1;char*a2;cin»a1;cin»a2;cout«"a1=n
4、指针來理解,所以b的值会改变。函数屮的参数intel只是在函数屮起作用,当函数结束时候便消失了,所以在main()屮不起作用3、关于全局变量和局部变量的一个问题先不废话了,先看看程序:#include“iostream.h”inta=5;int*example1(intb){a+=b;return&a;}int*example2(intb){intc=5;b+=c;return&b;}voidmain(){int*a1=example1(10);int*b1=example2(10);cout«"a1=n«*a15、么会是4135,而不是15呢?是程序的问题?没错吧?由于a是全局变量,存放在全局变量的内存区,它一直是存在的;而局部变量则是存在于函数的栈区,当函数example2()调用结朿后便消失,是b指向了一个不确定的区域,产生指针悬挂。下面是对examplei()和example2()的反汇编(用TC++3.0编译):examplei():pushbp;movbp,spmovaxJbp+04];add[OOAA],ax;movax,OOAA;movax,[bp-02];add[bp+04],ax;leaaxJbp+O4];传递参数相加问题就出在这里入栈传递参数相加返冋了结果所在的地址popbp;6、恢复栈,出栈ret;退岀函数example2():pushbp;入栈movbp,spsubsp,02movwordptr[bp-02],0005movsp,bppopbp;恢复栈,出栈ret;退岀函数对比之后看出来了吧?ax应该是存储的是结果的地址。而在example2()中,返回的却是[bp+04]的内容,因此指针指向了一个不确定的地方,由此产生的指针悬挂。examplei()中,ax返回了正确的结果的地址。4、内存问题:使用指针注意内存的分配和边界。使川指针过程屮应该给变量一个适当的空间,以免产生不可见的错谋。请看以下代码:#include7、){char*a1;char*a2;cin»a1;cin»a2;cout«"a1=n
5、么会是4135,而不是15呢?是程序的问题?没错吧?由于a是全局变量,存放在全局变量的内存区,它一直是存在的;而局部变量则是存在于函数的栈区,当函数example2()调用结朿后便消失,是b指向了一个不确定的区域,产生指针悬挂。下面是对examplei()和example2()的反汇编(用TC++3.0编译):examplei():pushbp;movbp,spmovaxJbp+04];add[OOAA],ax;movax,OOAA;movax,[bp-02];add[bp+04],ax;leaaxJbp+O4];传递参数相加问题就出在这里入栈传递参数相加返冋了结果所在的地址popbp;
6、恢复栈,出栈ret;退岀函数example2():pushbp;入栈movbp,spsubsp,02movwordptr[bp-02],0005movsp,bppopbp;恢复栈,出栈ret;退岀函数对比之后看出来了吧?ax应该是存储的是结果的地址。而在example2()中,返回的却是[bp+04]的内容,因此指针指向了一个不确定的地方,由此产生的指针悬挂。examplei()中,ax返回了正确的结果的地址。4、内存问题:使用指针注意内存的分配和边界。使川指针过程屮应该给变量一个适当的空间,以免产生不可见的错谋。请看以下代码:#include7、){char*a1;char*a2;cin»a1;cin»a2;cout«"a1=n
7、){char*a1;char*a2;cin»a1;cin»a2;cout«"a1=n
此文档下载收益归作者所有