分类: C/C++
2013-07-29 01:09:21
1、指针的定义:
指针其实和其他变量一样,只是指针包含的不是数据,是一个指向内存位置的地址,可以理解为一个记录地址(位置)的标签。
#include
void main()
{
int nNumber;
int *pPionter;
//赋值
nNumber=15;
pPionter=&nNumber;
//打印nNumber的值
printf("nNumber is equal to:%d\n",nNumber);
//通过pPionter控制nNumber
*pPionter=25;
printf("nNumber is equal to:%d\n",nNumber);
}
2、代码对比:
#include
int *pPointer;
void SomeFunction()
{
int nNumber;
nNumber = 25;
// 使pPointer指向nNumber:
pPointer = &nNumber;
}
void main()
{
SomeFunction();
printf("Value of *pPointer: %d\n", *pPointer);
}
这个自我认为是理论来讲的,不过我只是在vc6.0和dev-c上验证的,代码结果是:25
理论结果:当函数结束的时候,由于nNumber是一个本地变量,那么它就会被销毁。这是因为当语句块结束的时候,块中定义的本地变量都会被销毁。这就意味着当SomeFunction返回到main()的时候,那个变量就已经被销毁了,所以pPointer将会指向一个不再属于本程序的内存位置。(除非有其他变量倍分配到相同得位置,那块内存区得内容永远不变。如果系统帮你去做这种所谓得“销毁”,首先着毫无意义,其次这需要牺牲很多系统性能。而且,“销毁”成什么值才是“销毁”了呢?系统根本不知道该如何销毁)
动态分配:
#include
int *pPointer;
void SomeFunction()
{
// 使pPointer指向一个new的整数
pPointer = new int;
*pPointer = 25;
}
void main()
{
SomeFunction();// 让pPointer指向某些东西
cout<<"Value of *pPointer:"<<*pPointer<
}
3、指针的作用
a、传值(形参、返回值)
void AddFive(int* Number)
{
*Number = *Number 5;
}
b、作为指向类的指针
class MyClass
{
public:
int m_Number;
char m_Character;
};
void main()
{
MyClass *pPointer;
pPointer = new MyClass;
pPointer->m_Number = 10; //注意此处与非指针时的不同“.”"->"
pPointer->m_Character = 's';
}
c、指针和数组
可以理解为数组的首地址,不过在具体的引入时注意数组的大小防止越界和指针的指向
int *pArray;
int MyArray[6];
pArray = &MyArray[0]; //注意这样的错误“pArray = &MyArray;”,这是不正确的。如果你这么写了,你会获得一个指向数组指针的指针
4、引用和指针
引用和指针十分相似,在很多情况下用哪一个都可以
int& Number = myOtherNumber;
Number = 25;
引用就像是myOtherNumber的指针一样,只不过它是自动解析地址的,所以它的行为就像是指针指向的实际值一样。与其等价的指针代码如下:
int* pNumber = &myOtherNumber;
*pNumber = 25;
指针和引用的另一个不同就是你不能更换引用的内容,也就是说你在声明之后就不能更换引用指向的内容了。例如,下面的代码会输出20:
int myFirstNumber = 25;
int mySecondNumber = 20;
int &myReference = myFirstNumber;
myReference = mySecondNumber;
cout<< myFristNumber<
当在类中的时候,引用的值必须由构造函数设置,像下面这种方法一样:
CMyClass::CMyClass(int &variable) : m_MyReferenceInCMyClass(variable)
{
// 这里是构造代码