首先,什么叫做指针的初始化?
int * p = NULL;在定义指针变量p的同时把p的值设置为0x00000000;而不是把*p的值设置为0x00000000。这个过程叫做初始化。
探讨: int * p = & a; 和 int * p = &(int )0x0012ff60; 的含义和区别
(1)我们来看第一段代码:
#include <stdio.h>
int main(void)
{
int a = 0;
int *p = &a;
printf("The value is: %d/n", *p);
return 0;
}
我们怎样理解变量a呢?
一个变量具有一个变量名,对它赋值后就有一个变量值,变量名和变量值是两个不同的概念:变量名对应于内存单元的地址,表示变量在内存中的位置,而变量值则是放在内存单元中的数据,也就是内存单元的内容。变量名对应于地址,变量值对应于内容,应以区别。
例如定义一个整形变量int x,编译器就会分配两个存储单元给x。如果给变量赋值,令x=30,这个值就会放入对应的存储单元中。虽然这个地址是由编译器分配的,但我们是无法事先确定的,但可以用取地址运算符&取出变量x的地址,例如取x变量的地址用&x。
我们怎样理解&取地址运算符呢?
对于c语言中的&运算符,百度百科是这样定义的:(&p)则是这样一种运算,返回一个指针,该指针的值是当时声明p 时开辟的地址,指针的类型是p的类型对应的指针类型。该指针是由编译器分配,而不是由程序指定的,但指针值可以用&p取出的。
(2)我们来看第二段代码
#include "stdio.h"
int main(void)
{
// int a = 0; // &a = 0x0012ff60
int *p = (int*)0x0012ff60;
printf("The value is: %d/n", *p);
return 0;
}
为什么不能直接用int *p = 0x0012ff60来完成初始化操作呢?
我们知道:赋值符号“=”左右两边数据类型应相同,在这里等号左右两边应同为指针类型。而0x0012ff60作为一个整形数据是不能直接赋值给指针类型的。
那么我们这么写可以吗?int *p = &0x01000;
这显然不行。因为对于一个数值常量,它是没有地址的。而变量之所以有地址就是因为要有一个存储单元对变量进行标识(当然,变量也可以直接映射到某个寄存器)。
我们将0x0012ff60强制类型转换(int*),这时它也变成一个指针类型,可完成赋值操作。