指针详解
来源:互联网 发布:卖萌软件 编辑:程序博客网 时间:2024/05/22 06:05
指针详解
1.指针的概念
指针是一个特殊的变量,它存储的是内存里的一个地址。
2.指针的类型
当我们把指针声明语句里的指针名字去掉,那么剩下的部分就是这个指针的类型。
int *ptr; //指针的类型是int *
char*ptr; //指针的类型是char *
int **ptr; //指针的类型是int **
int(*ptr)[3]; //指针的类型是int (*)[3]
3.指针所指向的类型
当你通过指针来访问指针所指向的内存区域时,指针所指向的类型决定了编译器将把那片内存当作什么来处理。
方法:把指针名字和左边的*去掉,剩下的就是指针所指向的类型。
int*ptr; //指针所指向的类型为int
int**ptr; //指针所指向的类型是int *
int (*ptr)[3]; //指针所指向的类型是int ()[3]
在这里,我们要深刻区分两个概念,指针的类型和指针所指向的类型,这是精通指针的关键点之一。
4.指针的值
当我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域。同样,我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
5.指针本身所占据的内存区
用sizeof(指针的类型)可以知道在32位平台里,指针本身占据了4个字节的长度。
例:
intarray[10];
int(*ptr)[10];
ptr= &array;
分析:
ptr是一个指针,它的类型是int(*)[10],它指向的类型是int [10]
注意,sizeof(对象)测出的是对象自身类型的大小
sizeof(ptr)== 4
sizeof(int[10]) == 40
6.指针与函数的关系
把一个指针声明成为一个指向函数的指针。
intfun1(char*,int);
int(*pfun1)(char *,int );
pfun1= fun1;
…
inta = (*pfun1)(“afdsf”,7);
7.易混点
int*p[3]; //首先从p处开始,先与[]结合,因为其优先级比*高,所以p是一个数组,然后再与*结合,说明数组里面的元素是指针类型,然后再与int结合,说明指针所指向的类型是整形的。
int(*p)[3]; //首先从p处开始,先与*结合,说明p是一个指针,然后再与[]结合,说明指针所指向的内容是一个数组,然后再与int结合,说明数组里的元素是整形的,所以p是一个指向整形数据组成的数组的指针。
8.指针的作用
我们为什么要使用这么难以理解的指针,相信这是很多初学者的问题,下面我来说一下指针的作用。
1)参数传递
当我们想要在子函数中修改传递进去的参数的值的时候(而不是它的拷贝值),那么我们必须传递指针,虽然在C++中有了引用,但是引用的本质就是指针。
2)动态的内存分配
有时候,我们很难预计需要开辟多少内存空间,这时候就需要我们动态的创建变量,这时候就需要用到指针。
3)数据结构,数据结构是离不开指针的,无论是链表、树,还是图,都是与指针密切相关。如果你想编写一个出色的存储查找程序,就必须使用指针,就比如我们平时用到的几乎所有的数据库内部存储查找结构都是如此。
4)效率更高,不同通过变量名,直接操作内存,这样效率会大大提高。
9.指针的初始化
如果定义了一个指针,我们没有初始化的话,那么该指针可能是任意值(甚至是指向你操作系统的某个核心块),所以没有初始化的指针是极不安全的,绝大多数情况下也是
无法正常使用的。
数组也是指针,为什么我们可以像定义常量定义数组,而不用初始化呢?
这里因为,编译器对数组的处理是先分配内存,然后把内存的地址给数组指针,这实际上就是已经初始化了。
还有一点要记住,任何字符串都是指针。