对于初学C或C的初级程序员很多人在用指针却不清楚指针究竟是怎么回事!!不少的书对于这个问题通常也是含糊其词,搞得学习的人很郁闷。很多的人甚至在写C或C++代码的时候,养成尽量少用指针的习惯。看到这种情况我觉得实在是~~~,于是决定写下此文,在这里我将用简短的内容简要的讲下这个问题,写它的时候,我撇开内存分配机制(页、段),希望通过这篇文章可以帮助大家正确且清晰的认识指针。
且看下图,这是我对某段内存一个非常抽象的表达,其中,左边是地址 p , a , b 他们是一个内存地址,也就是说我可以假设说 p = 0x10000f8 a = 0x10220 b = 0x56998 (出于习惯,内存地址我用16进制表示)。左边是内容(值)P 、A 、B是p 、a 、b所在地址的值。
在认识指针之前,我们必须先认识,普通变量的赋值
当我们要取值 A 的时候,程序里会用到 a
如 b = a 那么这个时候 B 就变成了A
结果如下
也就是说,在程序中我们用变量的地址(或说他们的名字)a 来表值A
那么指针一般怎么写? 是不是*p ,那么这个地方的“*”究竟是怎么意思?我们有必要先弄清楚这个问题;
“&”和 “*”这对冤家 ~~~~
“&”是取地址、“*”是取内容。意味着在程序中
&a 表示的是值A的地址,也就是前面提到的a = 0x10220
而“*”并不是所有的变量都可以用到哦,在C里只有指针变量才有资格用它 (*p)
原因是指针本身就与众不同,如图中的p 他的值为P ,而P本身就是一个内存地址,但是p本身也是一个变量,那就意味着他同样具有变量的特性,所以,如前面所说,我们要得到P,我们可以在程序里通过引用 p 来实现。int *p,*q; ... q = p; 和变量一样char a1,a2;...a1=a2; ,只要大家的类型一样,就可以这样搞。
接着,我们对 p = &a ; 这个操作做下解释。
这个操作是把a的地址给p,也就是说做完这个操作后P = 0x10220
简单代码(运行环境vs2005)
#include <iostream>
using namespace std;
int main(void)
int a = 2,b = 3;
int *p,*q;
p = &a;
q = &b;
p = q;
cout<<*p<<endl;
return 0;
}
就写怎么多了,因为很晚了得睡觉去 886
早上起床,我继续写
接下来讨论
*p = NULL;
这个问题似乎比较复杂,其实不然,首先、前面已经知道*p表示的是某个内存量(如:a)为方面理解,这里我们使用面向对象的概念,而NULL表示“没有”。在VC++2005中反编译
int *p = NULL; ==> mov dword ptr [p],0
默认情况下,VC++2005编译器会给NULL指针附一个0的初值,意思是:指针p指向内存中一个不存在的对象或者另一种说法指针不指向当前内存中任何对象。
上面代码中如果加入下面的语句
*p = NULL;
cout<<*p<<endl;
*p = a;
cout<<*p<<endl;
运行结果是 0 2
2当然容易理解,那么0呢?为什么是0?原因是当指针不指向任何内存单位的时候,这个时候vs2005编译器会给他赋值0,也就是说P会变成0。
地震让大伙知道:居安思危,才是生存之道。