动态分配
#include <stdio.h>
int *pPointer;
void SomeFunction()
{
// 使pPointer指向一个new的整数
pPointer = new int;
*pPointer = 25;
}
void main()
{
SomeFunction(); // 让pPointer指向某些东西
printf("Value of *pPointer: %d/n", *pPointer);
delete pPointer;
}
向函数传递指针
#include <stdio.h>
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);
}
指向类的指针
关于指针,我还有还有两点需要提醒你。其中之一是指向结构或类的指针。你可以像这样定义一个类:
class MyClass
{
public:
int m_Number;
char m_Character;
};
然后,你可以定义一个MyClass的变量:
MyClass thing;
你应该已经知道这些了,如果还没有的话,你需要阅读一下这方面的资料。你可以这样定义一个指向MyClass的指针:
MyClass *thing;
就像你期望的一样。然后,你可以为这个指针分配一些内存:
thing = new MyClass;
这就是问题之所在了——你将如何使用这个指针?呃,通常你会这么写:“thing.m_Number”,但是对于这个例子不行,因为thing并非一个MyClass,而是一个指向MyClass的指针,所以它本身并不包含一个名为“m_Number”的变量;它指向的结构才包含这个m_Number。因此,我们必须使用一种不同的转换方式。这就是将“.”(点)替换为一个“->”(横线和一个大于号)。请看下面这个例子:
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;
}
指向数组的指针
#include <stdio.h>
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);
}
如果是用new为一个数组分配空间的话,就像下面这个样子:
int *pArray;
pArray = new int[6];
那么必须这样释放它:
delete[] pArray;
请注意delete之后的[]。这告知编译器它正在删除一个整个的数组,而不是单独的一个项目。必须在使用数组的时候使用这种方法,否则可能会获得一个内存泄漏。
不能delete掉那些没有用new分配的内存,像下面这个样子:
void main()
{
int number;
int *pNumber = number;
delete pNumber; // 错误:*pNumber不是用new分配的
}
----------------------------------------------------------------------------------------------------------
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分配的内存。