1.指针是一个变量,用来存储值的地址。
下面我们来看一下常规变量的地址(取地址运算符&)
#includeusing namespace std; int main() { int donuts = 6; double cups = 4.5; cout << "donuts value= " << donuts << " and donuts address= " << &donuts << endl; cout << "cups value= " << cups << " and cups address= " << &cups << endl; return 0; }
在指针前加*可以取出该地址处存储的值。
如下代码:
#includeusing namespace std; int main() { int updates = 6; int *p_updates; p_updates = &updates; cout << "Value:updates= " << updates << endl; cout << "*p_updates= " << p_updates << endl; cout << "Address:&updates= " << &updates << endl; cout << "*p_updates=" << *p_updates << endl; *p_updates = *p_updates + 1; cout << "Now value:updates= " << updates << endl; return 0; }
由以上代码可以看出,整型变量updates和指针变量p_updates代表一枚硬币的两面,updates表示值,而p_updates表示地址,并用*运算符来获得值。
2.指针的危险。
long *fellow;//create a pointer-to-long *fellow=23233;//place a value in never-never land
以上代码指针所指向的地址并不明确。
警告:在对指针的内容操作之前,一定要确保指针所指向的地址是确定的。
3.指针和数字。
从概念上来看,指针与整数是两种截然不同的类型。
4.使用new来分配内存空间。
指针主要用于在运行阶段分配未命名的内存来存储值。在C语言中可以使用malloc()来分配内存空间,而C++还有更好的方法----new运算符。
例如:在运行阶段为一个int值分配未命名的内存,并用指针来访问这个值。程序员要告诉new,需要为那种数据类型分配内存,new将找到一个长度正确的内存块,并返回该内存块的地址。
int *pn=new int;
new int告诉程序,需要存储int的内存,new运算符根据类型来确定需要多少字节的内存。然后他找到这样的内存,并返回其地址。
下列代码将展示new的用法:
#includeusing namespace std; int main() { int nights = 1001; int* pt = new int; *pt = 1001; cout << "nights value= " << nights << ":location=" << &nights << endl; cout << "int value=" << *pt << ":location=" << pt << endl; double* pd = new double; *pd = 10000001.0; cout << "double value=" << *pd << ":location=" << pd << endl; cout << "locatin of pointer pd=" <<&pd << endl; cout << "sizeof pt=" << sizeof(pt) << endl; cout << "sizeof *pt=" << sizeof(*pt) << endl; cout << "sizeof pd=" << sizeof(pd) << endl; cout << "sizeof *pd=" << sizeof(*pd) << endl; return 0; }
对于指针,new分配的内存块通常与常规变量声明分配的内存块不同,变量nights和pd的值都存储在stack的内存区域中,而new分配的内存在heap之中。
5.使用delete释放内存。
delete运算符使得在使用完内存后,能够将其归还给内存池。
例如:
int *ps=new int; ...... delete ps;
这将释放ps指向的内存,但不会删除ps本身。
new与delete一定要配对使用。
6.用new来创建动态数组.
如果程序只使用一个值,则只需声明一个简单变量。但对于大型数据(如数组,字符串和结构体),应使用new.
- 在编译时给数组分配内存空间被称为静态联编。
- 在运行阶段给数组分配内存空间成为动态联编。
使用new来创建动态数组的方法:
int *psome=new int[10]; delete [] psome;
使用new和delete时,遵循以下规则:
- 不要使用delete来释放不是new分配的内存。
- 不要使用delete释放同一个内存块两次。
- 如果使用new[]为数组分配内存,则应使用delete[]来释放。
- 如果使用new为实体分配内存,则应使用delete来释放。
- 对空指针应用delete是安全的。
下面代码展示了如何通过指针来访问动态数组:
#includeusing namespace std; int main() { double *p3=new double[3]; p3[0] = 0.2; p3[1] = 0.5; p3[2] = 0.8; cout << "p3[1] is " << p3[1] << endl; p3=p3 + 1; cout << "Now p3[0] is " << p3[0] << endl; cout << "Now p3[1] is " << p3[1] << endl; p3 = p3 - 1; delete[] p3; return 0; }



