|
楼主 |
发表于 2008-12-19 21:55:46
|
显示全部楼层
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/> }<br/> 同样,你也可以减去值,所以pArray - 2就是pArray当前位置的前两个元素。不过,请确定你是在操作指针,而不是操作它指向的值。这种使用指针的操作在循环的时候非常有用,例如for或while循环。<br/> 请注意,如果你有了一个指针(例如int* pNumberSet),你也可以把它看作一个数组。比如pNumberSet[0]相当于*pNumberSet,pNumberSet[1]相当于*(pNumberSet + 1)。<br/> 关于数组,我还有最后一句警告。如果你用new为一个数组分配空间的话,就像下面这个样子:<br/> int *pArray;<br/> pArray = new int[6];<br/> 那么必须这样释放它:<br/> delete[] pArray;<br/> 请注意delete之后的[]。这告知编译器它正在删除一个整个的数组,而不是单独的一个项目。你必须在使用数组的时候使用这种方法,否则可能会获得一个内存泄漏。
<p> 最后的话</p>
<p> 最后要注意的是:你不能delete掉那些没有用new分配的内存,像下面这个样子:<br/> void main()<br/> {<br/>int number;<br/>int *pNumber = number;<br/>delete pNumber; // 错误:*pNumber不是用new分配的<br/> }</p>
<p> 常见问题及FAQ</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> 引用</p>
<p> 从某种角度上来说,引用已经超过了本文的范围。但是,既然很多读者问过我这方面的问题,那么我在此对其进行一个简要的讨论。引用和指针十分相似,在很多情况下用哪一个都可以。如果你能够回忆起来上文的内容——我提到的“&”读作“the address of(……的地址)”,在声明的时候例外。在声明的这种情况下,它应该读作“a reference to(……的引用)”,如下:<br/> int& Number = myOtherNumber;<br/> Number = 25;<br/> 引用就像是myOtherNumber的指针一样,只不过它是自动解析地址的,所以它的行为就像是指针指向的实际值一样。与其等价的指针代码如下:<br/> int* pNumber = &myOtherNumber;<br/> *pNumber = 25;<br/> 指针和引用的另一个不同就是你不能更换引用的内容,也就是说你在声明之后就不能更换引用指向的内容了。例如,下面的代码会输出20:<br/> int myFirstNumber = 25;<br/> int mySecondNumber = 20;<br/> int &myReference = myFirstNumber;<br/> myReference = mySecondNumber;<br/> printf("%d", myFristNumber);<br/> 当在类中的时候,引用的值必须由构造函数设置,像下面这种方法一样:<br/> CMyClass::CMyClass(int &variable) : m_MyReferenceInCMyClass(variable)<br/> {<br/>// 这里是构造代码<br/> }</p>
<p> 总结</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><!--新闻内容//--><!--评论发布--> |
|