新手谈C指针02__int *p=NULL、*p=NULL、*(int *)0x0018ff44.

int  *p = NULL;

此语句什么意思?没错,就是定义了一个整型指针变量P,并进行了初始化。

那么,现在有个问题。它初始化了什么东西?NULL?

NULL又是什么?(这里需要注意)

NULL是被宏定义成 0 。即为 define   NULL  0 

很多系统下除了NULL之外,还有NUL(VC++6.0上提示说不认识NUL。error C2065: 'NUL' : undeclared identifier )NUL是ASCII码表的第一个字符,表示的是空字符,其ASCII码值为0;虽然都为0,但表示的意思完全不一样。同样,NULL和0表示的意思也完全不一样。一定不要混淆。


既然我们知道NULL是0,就是说指针变量P初始化为0了。

在前一篇新手谈C指针01_指针?中我们已经说过,指针变量内任何数据都会被当作地址进行处理。所以,P 里存储的是地址0x00000000。而不是把 *p 里的内容初始化为0。

其实,在上一篇博文也提到了。我们可以把 int * 看成一个整体,这时候变量就是P,而不是*P,所以初始化也是对 P 初始化。


我们再来看一个。

int    *P;
*p = NULL;

定义一个整型指针变量,然后往变量内存储的地址写内容。你是这样想的吗?

首先,这个程序可以正常编译。但不能正常运行。为什么呢?让我们一起看看。


我们是定义了一个指针变量。但是变量存放的地址是什么地址?是哪里的?我们知道,计算机中,有些地址是不能够被访问。

所以,我们在完全不知道里面存放的是什么地址时候,我们就直接往里面写内容。你这样做,计算机当然不允许了。但是可能会有人奇怪,那为什么编译器能通过呢?初学者会形成一个思维,编译器能编译通过就没有问题了。这是不对的。编译器帮我们检测的是语法上的错误,所以这个程序能编译通过只是说明我们在写的时候在语法上没有错误。并不代表一定能够运行。

如果改成以下这样就没有问题。

int    *p;
int    i=2;
p = &i;
这时候我们就可以用 *p 进行读写操作了。


如果我们想要往一个特定的内存地址写内容呢?

int    *p = (int *)0x0018ff40;       //例子1

这样子我们就可以往 0x0018ff40这个地址里写东西了。

根据上面的例子,如果我们这样子呢?

*( 0x0018ff40 ) = 2;         //例子2
例子2看似没有问题。 0x0018ff40 不是地址么?那我们就可以用 *运算符直接对其写内容了。

如果这样想就错了。看看例子10x0018ff40前面是不是有个强制类型转换?没错,所以我们也需要在前面加上强制类型转换。

*(int*)0x0018ff40 = 2;     //正确

看到这里,或许有人会想到。那我就可以随意的往任何地址读写了。但是,前面也说过,计算机有些内存地址是不被访问的。所以,本人估计利用这种方法也不能进行读写。因为计算机可能会有保护机制。但是,这只是猜测,没有经过实践。有实践过也请留个言,谢谢。:)



你可能感兴趣的:(C语言,c,C,指针)