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);
}
同样,你也可以减去值,所以pArray - 2就是pArray当前位置的前两个元素。不过,请确定你是在操作指针,而不是操作它指向的值。这种使用指针的操作在循环的时候非常有用,例如for或while循环。
请注意,如果你有了一个指针(例如int* pNumberSet),你也可以把它看作一个数组。比如pNumberSet[0]相当于*pNumberSet,pNumberSet[1]相当于*(pNumberSet + 1)。
关于数组,我还有最后一句警告。如果你用new为一个数组分配空间的话,就像下面这个样子:
int *pArray;
pArray = new int[6];
那么必须这样释放它:
delete[] pArray;
请注意delete之后的[]。这告知编译器它正在删除一个整个的数组,而不是单独的一个项目。你必须在使用数组的时候使用这种方法,否则可能会获得一个内存泄漏。
最后的话
最后要注意的是:你不能delete掉那些没有用new分配的内存,像下面这个样子:
void main()
{
int number;
int *pNumber = number;
delete pNumber; // 错误:*pNumber不是用new分配的
}
常见问题及FAQ
Q:为什么在使用new和delete的时候会得到“symbol undefined”错误?
A:这很可能是由于你的源文件被编译器解释成了一个C文件,因为new和delete操作符是C++的新特性。通常的改正方法是使用.cpp作为你的源文件扩展名。
Q:new和malloc的区别是什么?
A:new是C++特有的关键词,并且是标准的分配内存方法(除了Windows程序的内存分配方法之外)。你绝不能在一个C C++程序中使用malloc,除非绝对必要。由于malloc并不是为C++面向对象的特色设计的,所以使用它为类对象分配内存就不会调用类的构造函数,这样就会出现问题。由于这些原因,本文并欢运墙刑致郏⑶抑灰锌赡埽乙嗷岜苊馐褂盟恰?
Q:我能一并使用free和delete吗?
A:你应该使用和分配内存相配套的方法来释放内存。例如,使用free来释放由malloc分配的内存,用delete来释放由new分配的内存。
引用
从某种角度上来说,引用已经超过了本文的范围。但是,既然很多读者问过我这方面的问题,那么我在此对其进行一个简要的讨论。引用和指针十分相似,在很多情况下用哪一个都可以。如果你能够回忆起来上文的内容——我提到的“&”读作“the address of(……的地址)”,在声明的时候例外。在声明的这种情况下,它应该读作“a reference to(……的引用)”,如下:
int& Number = myOtherNumber;
Number = 25;
引用就像是myOtherNumber的指针一样,只不过它是自动解析地址的,所以它的行为就像是指针指向的实际值一样。与其等价的指针代码如下:
int* pNumber = &myOtherNumber;
*pNumber = 25;
指针和引用的另一个不同就是你不能更换引用的内容,也就是说你在声明之后就不能更换引用指向的内容了。例如,下面的代码会输出20:
int myFirstNumber = 25;
int mySecondNumber = 20;
int &myReference = myFirstNumber;
myReference = mySecondNumber;
printf("%d", myFristNumber);
当在类中的时候,引用的值必须由构造函数设置,像下面这种方法一样:
CMyClass::CMyClass(int &variable) : m_MyReferenceInCMyClass(variable)
{
// 这里是构造代码
}
总结
这一主题最初是十分难以掌握的,所以你最好读上它个至少两遍——因为大多数人不能立即弄懂。下面我再为你列出本文的重点:
1、指针是一种指向内存中某个位置的变量,你可以通过在变量名前添加星号(*)来定义一个指针(也就是int *number)。
2、你可以通过在变量名前添加“&”来获得它的内存地址(也就是pNumber = &my_number)。
3、除了在声明中以外(例如int *number),星号应该读作“the memory location pointed to by(由……指向的内存位置)”。
4、除了在声明中以外(例如int &number),“&”应该读作“the address of(……的地址)”。
5、你可以使用“new”关键字来分配内存。
6、指针必须和它所指向的变量类型相配套,所以int *number不应该指向一个MyClass。
7、你可以向函数传递指针。
8、你必须使用“delete”关键字来释放你分配的内存。
9、你可以使用&array[0]来获得一个数组的指针。
10、你必须使用delete[]来释放动态分配的数组,而不是简单的delete。
这并非一个完全的指针指南,其中有一点我能够涉及到的其它细节,例如指针的指针;还有一些我一点也未涉及到的东西,例如函数指针——我认为作为初学者的文章,这个有些复杂了;还有一些很少使用的东西,在此我亦没有提到,省得让这些不实用的细节使大家感到混乱。
就这样了!你可以试着运行本文中的程序,并自己编写一些示例来弄懂关于指针的问题吧。
|
正在阅读:VC基础学习:初学者指针指南VC基础学习:初学者指针指南
2004-05-09 10:22
出处:PConline
责任编辑:linjixiong
键盘也能翻页,试试“← →”键