天天看点

指针学习笔记

一:指针的定义

c和c++有一个专门的存放地址的变量类型。这个变量叫做指针。

int* ip; //一个指向Int类型的指针

int** ip; //指向指针的指针

int *p[4]; //指针数组

int (*p)[4]; //指向数组的指针变量

int (*p)(); //指向函数的指针,函数没有参数,返回int类型

int (*p[])(); //指向函数的指针数组,函数没有参数,返回int类型

int (*(*f)(int,int))(int) //f是一个函数的指针,指向的函数的类型是有两个int参数并且返回一个函数指针的函数,返回的函数数指针指向有一个int参数并返回int的参数

分析:当看到这样的一个复杂的定义时,最好的处理方法就是从中间开始和向外扩张。“从中间开始”的意思是从变量名开始,这里指的是f。“向外扩展”的意思是先注意右边最近的项(在这个例子中f右边是右括号结束),然后注意左边(左边是*,表示是一个指针,指针指向一个...),然后注意左边(右边为(int,int),...带两个int类型参数的函数....),然后看左边(左边是*,表示函数返回的是一个指针),再看右边(右边是(int),...带一个int参数的函数...),再看左边(int指示函数返回int类型)。大多数申明都是以右-左-右....动作的方式工作的。

二:const指针与指向const的指针

const int* p; //指向const的指针

int* const p; //const指针

分析:从变量P向左看;

对于const int* p,可以看出它左边对应的先是 int*,可以说明它是一个int类型的指针,然后接着是const,可以说明它是一个指向const类型的指针

对于int* const p,可以看出它左边对应的先是const,可以说明p是const修饰,然后它左边对应的是int*,说明它是一个int类型的由const修饰的指针

不能把一个非const对象的地址赋给一个非const指针

三:指针和引用的差别

(1)非空区别。在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某个对象。因此如果你使用一个变量并且让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这个时候你应该把变量申明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高。

(2)合法性区别。在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。

(3)可修改性区别。指针与引用的另一个重要的区别是指针可以被重新赋值以能指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。

四:void指针

如果声明指针是void*,它意味着任何类型的地址都可以间接引用那个指针。

例如:

view plaincopy to clipboardprint?

  1. int mian()
  2. {
  3. void* vp;
  4. char c;
  5. int i;
  6. double d;
  7. vp = &c;
  8. vp = &i;
  9. vp = &d;
  10. }

一旦我们简介引用一个void*,就会丢失关于类型的信息。这意味着在使用前,必须转换成真确类型。

  1. int main()
  2. int i = 3;
  3. void* vp = &i;
  4. //*vp = 3; //错误用法,必须先将其转换成int类型后再使用
  5. *((int*)vp) = 3;

//*vp = 3; //错误用法,必须先将其转换成int类型后再使用

五:空指针和迷途指针的区别

空指针:指向NUll的指针叫做空指针

迷途指针:当delete一个指针的时候,实际上仅是让编译器释放内存,但指针本身依然存在。这时它就是一个迷途指针,也叫悬浮指针、失控指针。

通常,如果在删除一个指针后又把它删除一次,程序就会变得非常不稳定,任何情况都有可能发生。但是如果只是删除了一个空指针,则什么事都不会发生,这样做非常安全。

使用迷途指针或是空指针是非法的,而且有可能造成程序崩溃。如果指针是空指针,尽管同样是崩溃,但它同迷途指针造成的崩溃相比是一种可预料的崩溃。这样调试起来方便的多。

六:杜绝“野指针”

“野指针”的成因有三种:

1.没有初始化指针变量。任何指针变量刚被创建时不会自动成为null指针,它的默认值是随机的,它会乱指一气。所以,指针变量在创建的同时应该初始化,要么将指针设置为NULL,要么让它指向有效内存。

char *p = null;

char *str = new char;

继续阅读