| int* pNumberOne; int* pNumberTwo; |
| pNumberOne = &some_number; pNumberTwo = &some_other_number; |
| #include void main() { // 声明变量: int nNumber; int *pPointer; // 现在,给它们赋值: nNumber = 15; pPointer = &nNumber; // 打印nNumber的值: printf("nNumber is equal to : %d\n", nNumber); // 现在,通过pPointer来控制nNumber: *pPointer = 25; // 证明经过上面的代码之后,nNumber的值已经改变了: printf("nNumber is equal to : %d\n", nNumber); } |
| #include int *pPointer; void SomeFunction() { int nNumber; nNumber = 25; // 使pPointer指向nNumber: pPointer = &nNumber; } void main() { SomeFunction(); // 让pPointer指向某些东西 // 为什么这样会失败? printf("Value of *pPointer: %d\n", *pPointer); } |
这个程序首先调用SomeFunction函数,在其中创建了一个名为nNumber的变量,并且使pPointer指向这个变量。那么,这就是问题之所在了。当函数结束的时候,由于nNumber是一个本地变量,那么它就会被销毁。这是因为当语句块结束的时候,块中定义的本地变量都会被销毁。这就意味着当SomeFunction返回到main()的时候,那个变量就已经被销毁了,所以pPointer将会指向一个不再属于本程序的内存位置。如果你不懂这一点,那么你应该去读一读有关本地变量、全局变量以及作用域的东西,这些概念非常重要。
那么,如何解决这个问题呢?答案是使用一种名为动态分配的技术。请注意:在这一点上,C和C++是不同的。既然大多数开发者正在使用C++,那么下面的代码就使用C++来编写。
动态分配
动态分配也许可以算是指针的关键技术了。它被用于在没有定义变量的情况下分配内存,然后由一个指针指向这段内存。虽然这个概念好像很让人糊涂,其实它很简单。以下的代码解说了如何为一个整数分配内存空间:
| int *pNumber; pNumber = new int; |
| double *pDouble; pDouble = new double; |
| #include int *pPointer; void SomeFunction() { // 使pPointer指向一个new的整数 pPointer = new int; *pPointer = 25; } void main() { SomeFunction(); // 让pPointer指向某些东西 printf("Value of *pPointer: %d\n", *pPointer); } |
| #include int *pPointer; void SomeFunction() { // 使pPointer指向一个new的整数 pPointer = new int; *pPointer = 25; } void main() { SomeFunction(); // 让pPointer指向某些东西 printf("Value of *pPointer: %d\n", *pPointer); delete pPointer; } |
唯一的一行不同也就是最本质的一点。如果你不将内存delete掉,你的程序就会得到一个“内存泄漏”。如果出现了内存泄漏,那么除非你关闭应用程序,否则你将无法重新使用这段泄漏的内存。
向函数传递指针
向函数传递指针的技术非常有用,但是它很容易掌握(译注:这里存在必然的转折关系吗?呃,我看不出来,但是既然作者这么写了,我又无法找出一个合适的关联词,只好按字面翻译了)。如果我们要编写一段程序,在其中要把一个数增加5,我们可能会像这么写:
| #include void AddFive(int Number) { Number = Number + 5; } void main() { int nMyNumber = 18; printf("My original number is %d\n", nMyNumber); AddFive(nMyNumber); printf("My new number is %d\n", nMyNumber); } |
| #include void AddFive(int* Number) { *Number = *Number + 5; } void main() { int nMyNumber = 18; printf("My original number is %d\n", nMyNumber); AddFive(&nMyNumber); printf("My new number is %d\n", nMyNumber); } |
你可以试着自己编写一个程序来证明这一点。注意到AddFive函数中Number之前的“*”的重要性了吗?这就是告知编译器我们要在指针Number指向的数字上加5,而不是向指针本身加5。
最后要注意的一点是,你亦可以在函数中返回指针,像下面这个样子:
int * MyFunction();
在这个例子中,MyFunction返回了一个指向整数的指针。
指向类的指针
关于指针,我还有还有两点需要提醒你。其中之一是指向结构或类的指针。你可以像这样定义一个类:
| class MyClass { public: int m_Number; char m_Character; }; |
| MyClass thing; |
| MyClass *thing; |
| thing = new MyClass; |
| class MyClass { public: int m_Number; char m_Character; }; void main() { MyClass *pPointer; pPointer = new MyClass; pPointer->m_Number = 10; pPointer->m_Character = 's'; delete pPointer; } |
| int *pArray; pArray = new int[6]; |
| int *pArray; int MyArray[6]; pArray = &MyArray[0]; |
| #include void main() { int Array[3]; Array[0] = 10; Array[1] = 20; Array[2] = 30; int *pArray; pArray = &Array[0]; printf("pArray points to the value %d\n", *pArray); } |
| #include void main() { int Array[3]; Array[0] = 10; Array[1] = 20; Array[2] = 30; int *pArray; pArray = &Array[0]; printf("pArray points to the value %d\n", *pArray); pArray++; printf("pArray points to the value %d\n", *pArray); pArray++; printf("pArray points to the value %d\n", *pArray); } |
| int *pArray; pArray = new int[6]; |
| delete[] pArray; |
| void main() { int number; int *pNumber = number; delete pNumber; // 错误:*pNumber不是用new分配的 } |
| int& Number = myOtherNumber; Number = 25; |
| int* pNumber = &myOtherNumber; *pNumber = 25; |
| int myFirstNumber = 25; int mySecondNumber = 20; int &myReference = myFirstNumber; myReference = mySecondNumber; printf("%d", myFristNumber); |
| CMyClass::CMyClass(int &variable) : m_MyReferenceInCMyClass(variable) { // 这里是构造代码 } |
文档说明:
相关文档
返回首页 | 关于本站 | | 友情链接 | 广告服务 | 意见建议 | 访客留言 | 本站论坛
Copyright© 2001-2006 ProgramBBS.com All Rights Reserved 版权所有©编程论坛
Email: 吉ICP备05009985号
感谢长春订餐网友情支持