📄 csdn_文档中心_初学者指针指南.htm
字号:
=
&MyArray;”,这是不正确的。如果你这么写了,你会获得一个指向数组指针的指针(可能有些绕嘴吧?),这当然不是你想要的。</P>
<P><STRONG>使用指向数组的指针</STRONG></P>
<P> 如果你有一个指向数组的指针,你将如何使用它?呃,假如说,你有一个指向整数数组的指针吧。这个指针最初将会指向数组的第一个值,看下面这个例子:<BR><FONT
face="Courier New">#include <stdio.h><BR>void
main()<BR>{<BR> int Array[3];<BR> Array[0] =
10;<BR> Array[1] = 20;<BR> Array[2] = 30;<BR> int
*pArray;<BR> pArray = &Array[0];<BR> printf("pArray
points to the value %d\n",
*pArray);<BR>}</FONT><BR> 要想使指针移到数组的下一个值,我们可以使用pArray++。我们也可以——当然你们有些人可能也猜到了——使用pArray
+
2,这将使这个数组指针移动两个元素。要注意的一点是,你必须清楚数组的上界是多少(在本例中是3),因为在你使用指针的时候,编译器不能检查出来你是否已经移出了数组的末尾。所以,你可能很容易地使系统崩溃。下面仍然是这个例子,显示了我们所设置的三个值:<BR><FONT
face="Courier New">#include <stdio.h><BR>void
main()<BR>{<BR> int Array[3];<BR> Array[0] =
10;<BR> Array[1] = 20;<BR> Array[2] = 30;<BR> int
*pArray;<BR> pArray = &Array[0];<BR> printf("pArray
points to the value %d\n", *pArray);<BR> pArray++;<BR>
printf("pArray points to the value %d\n", *pArray);<BR>
pArray++;<BR> printf("pArray points to the value %d\n",
*pArray);<BR>}</FONT><BR> 同样,你也可以减去值,所以pArray -
2就是pArray当前位置的前两个元素。不过,请确定你是在操作指针,而不是操作它指向的值。这种使用指针的操作在循环的时候非常有用,例如for或while循环。<BR> 请注意,如果你有了一个指针(例如int*
pNumberSet),你也可以把它看作一个数组。比如pNumberSet[0]相当于*pNumberSet,pNumberSet[1]相当于*(pNumberSet
+ 1)。<BR> 关于数组,我还有最后一句警告。如果你用new为一个数组分配空间的话,就像下面这个样子:<BR><FONT
face="Courier New">int *pArray;<BR>pArray = new
int[6];</FONT><BR> 那么必须这样释放它:<BR><FONT face="Courier New">delete[]
pArray;</FONT><BR> 请注意delete之后的[]。这告知编译器它正在删除一个整个的数组,而不是单独的一个项目。你必须在使用数组的时候使用这种方法,否则可能会获得一个内存泄漏。</P>
<P><STRONG>最后的话</STRONG></P>
<P> 最后要注意的是:你不能delete掉那些没有用new分配的内存,像下面这个样子:<BR><FONT
face="Courier New">void main()<BR>{<BR> int number;<BR>
int *pNumber = number;<BR> delete pNumber; //
错误:*pNumber不是用new分配的<BR>}</FONT></P>
<P><STRONG>常见问题及FAQ</STRONG></P>
<P> Q:为什么在使用new和delete的时候会得到“symbol
undefined”错误?<BR> A:这很可能是由于你的源文件被编译器解释成了一个C文件,因为new和delete操作符是C++的新特性。通常的改正方法是使用.cpp作为你的源文件扩展名。</P>
<P> Q:new和malloc的区别是什么?<BR> A:new是C++特有的关键词,并且是标准的分配内存方法(除了Windows程序的内存分配方法之外)。你绝不能在一个C
C++程序中使用malloc,除非绝对必要。由于malloc并不是为C++面向对象的特色设计的,所以使用它为类对象分配内存就不会调用类的构造函数,这样就会出现问题。由于这些原因,本文并不对它们进行讨论,并且只要有可能,我亦会避免使用它们。</P>
<P> Q:我能一并使用free和delete吗?<BR> A:你应该使用和分配内存相配套的方法来释放内存。例如,使用free来释放由malloc分配的内存,用delete来释放由new分配的内存。</P>
<P><STRONG>引用</STRONG></P>
<P> 从某种角度上来说,引用已经超过了本文的范围。但是,既然很多读者问过我这方面的问题,那么我在此对其进行一个简要的讨论。引用和指针十分相似,在很多情况下用哪一个都可以。如果你能够回忆起来上文的内容——我提到的“&”读作“the
address of(……的地址)”,在声明的时候例外。在声明的这种情况下,它应该读作“a reference
to(……的引用)”,如下:<BR><FONT face="Courier New">int& Number =
myOtherNumber;<BR>Number =
25;</FONT><BR> 引用就像是myOtherNumber的指针一样,只不过它是自动解析地址的,所以它的行为就像是指针指向的实际值一样。与其等价的指针代码如下:<BR><FONT
face="Courier New">int* pNumber = &myOtherNumber;<BR>*pNumber =
25;</FONT><BR> 指针和引用的另一个不同就是你不能更换引用的内容,也就是说你在声明之后就不能更换引用指向的内容了。例如,下面的代码会输出20:<BR><FONT
face="Courier New">int myFirstNumber = 25;<BR>int mySecondNumber =
20;<BR>int &myReference = myFirstNumber;<BR>myReference =
mySecondNumber;<BR>printf("%d",
myFristNumber);</FONT><BR> 当在类中的时候,引用的值必须由构造函数设置,像下面这种方法一样:<BR><FONT
face="Courier New">CMyClass::CMyClass(int &variable) :
m_MyReferenceInCMyClass(variable)<BR>{<BR> //
这里是构造代码<BR>}</FONT></P>
<P><STRONG>总结</STRONG></P>
<P> 这一主题最初是十分难以掌握的,所以你最好读上它个至少两遍——因为大多数人不能立即弄懂。下面我再为你列出本文的重点:</P>
<P> 1、指针是一种指向内存中某个位置的变量,你可以通过在变量名前添加星号(*)来定义一个指针(也就是int
*number)。<BR> 2、你可以通过在变量名前添加“&”来获得它的内存地址(也就是pNumber =
&my_number)。<BR> 3、除了在声明中以外(例如int *number),星号应该读作“the memory
location pointed to by(由……指向的内存位置)”。<BR> 4、除了在声明中以外(例如int
&number),“&”应该读作“the address
of(……的地址)”。<BR> 5、你可以使用“new”关键字来分配内存。<BR> 6、指针必须和它所指向的变量类型相配套,所以int
*number不应该指向一个MyClass。<BR> 7、你可以向函数传递指针。<BR> 8、你必须使用“delete”关键字来释放你分配的内存。<BR> 9、你可以使用&array[0]来获得一个数组的指针。<BR> 10、你必须使用delete[]来释放动态分配的数组,而不是简单的delete。</P>
<P> 这并非一个完全的指针指南,其中有一点我能够涉及到的其它细节,例如指针的指针;还有一些我一点也未涉及到的东西,例如函数指针——我认为作为初学者的文章,这个有些复杂了;还有一些很少使用的东西,在此我亦没有提到,省得让这些不实用的细节使大家感到混乱。</P>
<P> 就这样了!你可以试着运行本文中的程序,并自己编写一些示例来弄懂关于指针的问题吧。</P><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0
width=770>
<TBODY>
<TR bgColor=#006699>
<TD align=middle bgColor=#006699 id=white><FONT
color=#ffffff>对该文的评论</FONT></TD>
<TD align=middle>
<SCRIPT src="CSDN_文档中心_初学者指针指南.files/readnum.htm"></SCRIPT>
</TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_初学者指针指南.files/ico_pencil.gif" width=16>
</SPAN> treey2001 <I>(2004-5-6 16:48:54)</I>
</TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3 width=532><BR>学习ing,谢谢!
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_初学者指针指南.files/ico_pencil.gif" width=16>
</SPAN> bushido <I>(2004-5-6 13:01:58)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3 width=532><BR>我是初學者,寫得很棒
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_初学者指针指南.files/ico_pencil.gif" width=16>
</SPAN> xinhai001 <I>(2004-5-4 9:08:46)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3
width=532><BR>我是初学者,甚至在看文章时都有些发憷,不过还是受益匪浅!谢谢! <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_初学者指针指南.files/ico_pencil.gif" width=16>
</SPAN> cyberkit <I>(2004-5-3 23:13:04)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3 width=532><BR>总结得不错
<BR></TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TH bgColor=#006699 id=white><FONT
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
<TBODY>
<TR>
<TD>你没有登陆,无法发表评论。 请先<A
href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=27393">登陆</A>
<A
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
<TBODY>
<TR align=middle>
<TD height=10 vAlign=bottom><A
href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A
href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A
href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A
href="http://www.csdn.net/english">English</A> </TD>
<TD align=middle rowSpan=3><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
border=0 height=48 src="CSDN_文档中心_初学者指针指南.files/biaoshi.gif"
width=40></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -