指针是一个变量,存储的是值的地址,而不是值本身。指针的真正用武之地是在运行阶段分配未命名的内存以存储值,在这种情况下,只能通过指针来访问内存。new分配内存,使用delete释放指针指向的内存,但是不会删除指针本身,可以将指针重新指向另一个新分配的内存块。一定要配对使用new和delete。不要使用delete释放同一个内存两次。
使用new来创建动态数组。把指针当数组名就可以访问动态数组元素。指针变量加1后,增加的量等于它指向的类型的字节数。
多数情况下,c++将数组名解释为数组第一个元素的地址。看一数组表达式 stacks[1],c++编译器将该表达式看作是*(stacks+1),这意味着先计算数组第二个元素的地址,然后找到存储在那里的值。*(stacks+1)和stacks[1]是等价的。通常使用数组表示法时,c++都执行下面的转换 arrayname[i] becomes * (arraayname +i),如果使用的是指针,不是数组名,也执行一样的操作,pointername[i] becomes * (pointername +i),因此在很多情况下,可以相同的方式使用指针名和数组名。可以使用数组方括号表示法,也可以使用解除指针操作符(*),在多数表达式中,它们都是地址,区别在于可以修改指针的值,而数组名是常量;另一个区别是对数组应用sizeof操作符求得是数组的长度,对指针应用sizeof得到的是指针的长度,即使指针指向的是一个数组。 总之使用new来创建数组以及使用指针访问不同的元素只要把指针当数组名对待即可。例如
#include <iostream>
int main()
{
using namespace std;
int p[10]={1,2,3,4,5,6,7,8,9};
int *q=p; //int*q=&p[0];
cout<<*p<<endl;
cout<<*(p+1)<<endl;
cout<<*(q+2)<<endl;
cout<<*(q+3)<<endl;
cout<<*(p+3)<<endl;
q=q+4; //p=p+4 is invalid
cout<<*q<<endl;
return 0;
}输出是
1 2 3 4 4 5.
使用方括号数组表示法等同于对指针解除引用。
p[0] means *p means *q
p[2] means *(p+2) means *(q+2)