首页 > 技术知识 > 正文

指针是变量,那必然会有变量类型,因此这里必须对变量类型做解释。在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; }

运行之后,结果如图:

C语言中指针变量简述-变量指针与指针变量

指针也是一个变量,那个指针也应该被存放在内存中,对于32位编译器来说,其寻址空间为2^32=4GB,为了能够都操作所有内存(实际上普通用户不可能操作所有内存),指针变量存放也要用32位数即4个字节。这样就有指针的地址&p,指针和变量的关系可以用如下图表示:

C语言中指针变量简述-变量指针与指针变量1

从上图可以看到复制&p是指针的地址,用来存放指针复制p,而指针复制p来存放变量复制a的地址,也就是复制&a,还有一个*p在C语言中是解引,意思是告诉编译器取出该地址存放的内容。

C语言中指针变量简述-变量指针与指针变量2

对于不同类型指针而言,其复制p+1所指向的地址不同,这个递增取决于指针类型所占的内存大小,而对于复制((unsigned int)p)+1,该意思是将地址p所指向的地址的值直接转换为数字,然后复制+1,这样无论p是何种类型的指针,其结果都是指针所指的地址后一个地址。

从上述可以看到,指针的存在使得程序员可以相当轻松的操作内存,这也使得当前有些人认为指针相当危险,这一观点表现在C#和Java语言中,然而实际上用好指针可以极大的提高效率。下面深入一点来通过指针对内存进行操作,现在我们需要对内存6422216中填入一个数据125,我们可以如下操作:

复制unsigned int *p=(unsigned int*)(6422216); *p=125;

猜你喜欢