声明和初始化指针
声明指针:
方式一:
typeName * pName;
int* ptr;
用这种方式声明指针后必须要对指针进行初始化后才能使用。
方式二:
int higgens = 5;
int* pt = &higgens;
这种情况初始化的是指针,pt和higgens指的同一个地址。
使用new分配内存
通用格式:
typeName* pointer_name = new typeName;
使用new分配内存,返回的是内存块的地址。
int nights = 1001;
int* pt = new int;//分配一个int类型的内存
*pt = 1001;//pt所指的内存存储的值和nights的值一样,但是pt的地址和nights的地址不同,它们处于不同的内存
double* pd = new double;//分配一个double类型的内存
*pd = 1001.0;
这里sizeof(pt)和sizeof(pd)的值一样,都为4,因为pt和pd都是指针,长度一样;sizeof(*pt)的值是4,sizeof(pd)的值是8,因为pt是int类型,*pd是double类型。
使用delete释放内存
delete pt;
pt = NULL;
delete pd;
pt = NULL;
已经释放过的内存不能再释放.
这里只是释放指针所指向的内存,并没有删除指针,内存释放之后可以让pt或pd再指向其他地址,如果不再指向其他地址,就设置为NULL,避免成为野指针。并且delete要和new配对使用,否则会发生内存泄漏。
使用new创建动态数组
通用格式:
typeName* pointer_name = new typeName[N];//N表示要包含多少个元素
例如:
int* psome = new int[10];//创建一个包含10个int元素的数组
这里new运算符返回的是第一个元素的地址。
释放内存:
delete [] psome;
动态数组的使用:
double* pa = new double[3];
pa[0] = 0.2;
pa[1] = 0.5;
pa[2] = 0.8;
cout << pa[1] << endl;
pa = pa + 1;//指针向后移一个单位,指向下一个元素
cout << pa[0] << endl;
cout << pa[1] << endl;
pa = pa - 1;//指针指向开始地址
delete[] pa;
pa = NULL;
输出结果:
0.5
0.5
0.8
数组和指针
double wages[3] = {10000.0, 20000.0, 30000.0};
short stacks[3] = {3, 2, 1};
//两个方式得到数组地址
double* pw = wages;
short* ps = &stacks[0];
cout << *pw << endl;//输出wages数组的第一个元素
pw = pw + 1;//指向下一个元素
cout << *pw << endl;
cout << *ps << endl;//输出stacks数组的第一个元素
ps = ps + 1;//指向下一个元素
cout << *ps << endl;
cout << stacks[0] << "," << stacks[1] << endl;
cout << *stacks << "," << *(stacks + 1) << endl;
cout << sizeof(wages) << endl;//得到数组的长度
cout << sizeof(pw) << endl;//得到指针的长度
输出结果:
10000.0
20000.0
3
2
3,2
3,2
24
4
注意:
1、将指针变量加1,增加的量等于指针指向的类型占用的字节数
2、对数组应用sizeof运算符得到的是数组的长度,对指针运用sizeof得到的是指针的长度。
3、程序运行时,C++将数组名解释为地址。