深入了解指针
对于指针部分,之前一直搞不清,最近静下心仔细研究了一下,下面是我对指针部分的应用以及概念的一些理解与总结。
1、指针
指针是一个特殊的变量,他里面存储的数值被解释成内存里的一个地址。
要搞清一个指针首先需要搞清楚指针的四方面的内容:
指针的类型
指针所指向的类型
指针的值(指针所指向的内存区)
指针本身所占据的内存区
(1)指针的类型
我理解的最简便的做法就是:把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。(即指针本身所具有的类型)
eg:
1)int *ptr;//指针类型为 int *
2)char *ptr;//指针类型为 char *
3)int * *ptr; //指针类型为 int **
4)int(*ptr)[3]; //指针类型为 int( *)[3]
- int *( *ptr)[4]; //指针类型为 int *( *)[4]
这样理解来就简单了许多,再也不用纠结指针的类型到底是什么了~~
(2)指针所指向的类型
当你想通过指针来访问指针所指向的内存区域时,指针所指向的类型决定了编译器将会把那片内存区域里的内容当作什么来看待。
对此我给出的最简便的方法是:把指针声明语句中的指针名字和紧邻名字左边的指针声明符号*去掉,剩下的就是该指针所指向的类型。
eg:
1)int *ptr;//指针所指类型为 int
2)char *ptr;//指针所指类型为 char
3)int * *ptr; //指针所指类型为 int *
4)int(*ptr)[3]; //指针所指类型为 int()[3]
- int *( *ptr)[4]; //指针所指类型为 int *()[4]
敲的代码多了渐渐发现,对于指针部分的应用,有很多时候都是误解了指针本身的类型和指针所指向的类型,只有真的搞懂了两者的差别才能从后续指针的应用上得心应手。
(3)指针的值(指针所指向的内存区或地址)
指针的值是指针本身存储的数值,这个值将会被编译器当作一个地址处理。
我们所说的一个指针的值是xx,就相当于是在说该指针指向了以xx为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址
以后,每遇到一个指针,我们都应该问问:这个指针的类型是什么?这个指针指向的类型是什么?
(4)指针本身所占据的内存
我们只需用 sizeof(指针类型)测试一下就知道了。(eg:在32位平台里,指针本身占据了4个字节的长度)
2、运算符 & 和 *
这里的 & 是取地址运算符,* 是间接运算符。
&a 的运算结果是一个指针, 指针的类型是 a 的类型加个 *,指针所指向的类型是 a 的类型,指针所指向的地址,就是 a 的地址。
*p 的运算结果就各种各样了,总之 *p 的结果就是 p 所指向的东西,这个东西有这些特点:它的类型是 p 指向的类型,它所占用的地址是 p 所指向的地址。
eg:
int a=12; int b;
int *p; int **ptr;
p=&a;
//&a 的结果是一个指针,类型是 int*,指向的类型是
//int,指向的地址是 a 的地址。
*p=24;
//*p 的结果,在这里它的类型是 int,它所占用的地址是
//p 所指向的地址,显然,*p 就是变量 a。
ptr=&p;
//&p 的结果是个指针,该指针的类型是 p 的类型加个*,
//在这里是 int **。该指针所指向的类型是 p 的类型,这
//里是 int*。该指针所指向的地址就是指针 p 自己的地址。
*ptr=&b;
//*ptr 是个指针,&b 的结果也是个指针,且这两个指针
//的类型和所指向的类型是一样的,所以用&b 来给*ptr 赋
//值就是毫无问题的了。
**ptr=34;
//*ptr 的结果是 ptr 所指向的东西,在这里是一个指针,
//对这个指针再做一次*运算,结果是一个int类型的变量。
总结
以上就是近几日来我对指针的研究所得,希望能让你对指针的理解有所帮助。