指针
指针在程序中起到传递变量地址、优化内存调用的作用,为变量/对象声明指针后,指针承载了变量/对象的内存地址。这样一来,当我们需要访问该变量/对象的内存时,可以简单地对指针解引用,避免了内存重复调用,节省空间。
定义指针时,语法规则为:数据类型 * 指针变量名
使用指针时,可以解引用:在指针前加 * 表示解引用
在32位操作系统下,指针占用4个字节的内存空间;而64位操作系统下,占用8个字节空间。(无关数据类型)
指针的注意事项
a. 指针指向常量存储区对象
指针指向常量储存区的对象时,由于为常量(常量一经声明无法更改值),故无法对该对象进行写操作。
b. 资源泄露
#include<iostream>
using namespace std;
void main()
{
char *p=new char[3]; //分配三个字符空间,p指向该内存空间
p="ab"; //此时p指向常量“ab”,而不再是new char分配的内存空间了,从而造成了资源泄漏
delete []p; //释放时报错
}
如上执行时,由于资源泄露会报错或卡住。改进如下:
#include<iostream>
using namespace std;
void main()
{
char *p=new char[3]; //分配三个字符空间,p指向该内存空间
strcpy(p,"ab"); //将"ab"存储到p指向的内存空间
delete []p; //ok
}
*strcpy()函数用于字符串复制,用法是传入2个字符数组指针来执行,如strcpy(a,b)是将b指向的字符串复制到a指向的空间中。
有关于strcpy()及其安全版本strcpy_s()函数使用的注意事项,请点此处跳转
空指针
空指针在指针变量初始化时可作“临时占位符”,即当不指定指针所指向的内存地址时,空指针指向编号为0的内存。空指针也叫“NULL”。
注意:不可访问空指针所指定的内存(若访问,会报错。)
注意:编号0-255为系统预留内存。
野指针
野指针指的是由于强行数据转换等原因直接指向某一个未获得访问权限的内存空间的指针。在编写程序时应尽量避免生成野指针。
野指针的成因如下:
1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
char *p; //此时p为野指针
2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
char *p=new char[10]; //指向堆中分配的内存首地址,p存储在栈区
cin>> p;
delete []p; //p重新变为野指针
3)指针操作超越了变量的作用范围。
char *p=new char[10]; //指向堆中分配的内存首地址
cin>> p;
cout<<*(p+10); //可能输出未知数据