指针是变量,那必然会有变量类型,因此这里必须对变量类型做解释。在C语言中,所有的变量都有变量类型,整型、浮现型、字符型、指针类型、结构体、联合体、枚举等,这些都是变量类型。变量类型的出现是内存管理的必然结果,相信读者知道,所有的变量都是保存在计算机的内存中,既然是放到计算机的内存中,那必然会占用一定的空间,问题来了,一个变量会占用多少空间呢,或者说应该分出多少内存空间来放置该变量呢?为了规定这个,类型由此诞生了,对于32位编译器来说,int类型占用4个字节,即32位,long类型占用8字节,即64位。这里简单说了类型主要是为后面引出指针这个特殊性,在计算机中,将要运行的程序都保存在内存中,所有的程序中的变量其实就是对内存的操作。
#include "stdio.h"
int main(int argc, char **argv)
{
unsigned int a = 10;
unsigned int *p = NULL;
p = &a;
printf("&a=%d\n",a);
printf("&a=%d\n",&a);
*p = 20;
printf("a=%d\n",a);
return 0;
}
运行之后,结果如图:
指针也是一个变量,那个指针也应该被存放在内存中,对于32位编译器来说,其寻址空间为2^32=4GB,为了能够都操作所有内存(实际上普通用户不可能操作所有内存),指针变量存放也要用32位数即4个字节。这样就有指针的地址&p,指针和变量的关系可以用如下图表示:
从上图可以看到&p
是指针的地址,用来存放指针p
,而指针p
来存放变量a
的地址,也就是&a
,还有一个*p在C语言中是解引,意思是告诉编译器取出该地址存放的内容。
对于不同类型指针而言,其p+1
所指向的地址不同,这个递增取决于指针类型所占的内存大小,而对于((unsigned int)p)+1
,该意思是将地址p所指向的地址的值直接转换为数字,然后+1
,这样无论p是何种类型的指针,其结果都是指针所指的地址后一个地址。
从上述可以看到,指针的存在使得程序员可以相当轻松的操作内存,这也使得当前有些人认为指针相当危险,这一观点表现在C#和Java语言中,然而实际上用好指针可以极大的提高效率。下面深入一点来通过指针对内存进行操作,现在我们需要对内存6422216中填入一个数据125,我们可以如下操作:
unsigned int *p=(unsigned int*)(6422216);
*p=125;
全部0条评论
快来发表一下你的评论吧 !