10、指针 指针是一种指向内存单元的特殊变量。声明指针如下:int *pInteger = NULL; #初始化指针 使用引用运算符(&)获取变量的地址 可以声明一个int指针来储存变量的地址:int* pInteger = &age **可将不同的内存地址赋给同一个指针变量,让它指向不同的值,如下个程序:
#include<iostream> using namespace std; int main() { int age = 30; int* pInteger = &age; cout << "pInteger points to Age now" << endl; cout << "pInteger=0x" << hex << pInteger << endl; int dogsage = 9; pInteger = &dogsage; cout << "pInteger dogsage=0x" << hex << pInteger << endl; return 0; }使用解除引用运算符(星号)访问指向的数据,如:*pInteger #访问数据 将sizeof()用于指针时,结果与指针指向的变量类型无关,而是取决于使用的编译器和针对的操作系统。动态内存分配 使用new来动态的分配新的内存块。如果成功,new将返回指向一个指针,指向分配的内存;需要指定要为哪种数据类型分配内存。Type* Pointer = new Type; #Type为类型 还可以指定为多少个元素分配内存Type* Pointer = new Type[NumElements] 例如:int* Pointer = new int[10]; 使用new分配的内存最终都需要使用对应的delete进行释放delete Pointer;delete[] PointerPS: delete只能释放new创建的内存,而不是用于包含任何地址的内存。 将指针递增或递减时,其包含的地址将增加或减少指向的数据类型的sizeof(并不一定是1字节)。这样,编译器将确保指针不会指向数据的中间或末尾,而只会指向数据的开头。如下:Type* pType = Address; 则执行++PType后,PType将包含指向Address+sizeof(Type) 示例代码如下:
#include<iostream> using namespace std; int main() { cout << "how many integers you wish to enter?"; int InputNums = 0; cin >> InputNums; int*pNumbers = new int[InputNums]; int*pCopy = pNumbers; //保存了该地址的拷贝 cout << "sucessfully allocated memory for" << InputNums << "integers" << endl; for (int Index = 0; Index < InputNums; ++Index) { cout << "enter number" << Index << ":"; cin >> *(pNumbers + Index); } cout << "displaying all numbers input:" << endl; for (int Index = 0, int* pCopy = pNumbers; Index < InputNums; ++Index) { cout << *(pCopy++) << ":" << endl; } delete[] pNumbers; return 0; }将关键字const用于指针 const指针有如下三种: ①指针指向的数据为常量,不能修改,但可以修改指针的地址,即指针可以指向其它地方
int HoursInDay = 24; const int* pInteger = & HoursInDay②指针包含的地址是常量,不能修改,但可以修改指针指向的数据
int HoursInDay =24; int* const pInteger = & HoursInDay③指针包含的地址及它指向的值都是常量,不能修改
int HoursInDay = 24; const int* const pInteger = & HoursInDay务必初始化指针变量,如果不能将指针初始化为new返回的有效地址或它有效变量,可将其初始化为NULL。检查使用new发出的分配请求是否得到满足 C++提供了两种确保指针有效的方法,默认方法是使用异常,即如果内存分配失败,将引发std::bad_alloc异常。这将导致应用程序中断执行。异常处理有以下两种方法:
//第一种 #include<iostream> using namespace std; int main() { try { int* pAge = new int[5368709111]; delete[] pAge; } catch (bad_alloc) { cout << "memory failed.ending program" << endl; } return 0; } //第二种 #include<iostream> using namespace std; int main() { int* pAge = new(nothrow) int[0x1fffffff]; if (pAge) { delete[] pAge; } else cout << "memory allocation failed" << endl; return 0; }