图示指针

指针,应该说指针类型,是一种数据类型,像int类型,char类型,short类型等基础数据类型一样,它定义了一种指向数据地址的数据类型。

而定义数据类型的目的,是让编译程序在编译代码时,给相应的数据类型分配数据空间,比如,定义一个变量 int a;则编译程序编译时会给变量a分配连续4字节的内存地址(通常使用的环境),而a变量的地址则指向这4个字节的首地址,这连续的4字节就可以存储0x0~0xffffffff的值,这个值正是变量a的值;而如果我们定义char b;则编译程序会给变量b分配一个字节的内存地址,b变量的地址就是这个字节的地址,这个字节就是变量b所能存储的空间,也就是0x0~0xff的范围。

同理,定义一个指针类型的变量 char *c;在编译时,编译程序会分配连续4字节的内存空间用于存储一个32位的地址,为何分配连续4字节的空间,因为在我们目前使用的32位机上,地址线都是32位,而要表达32位的地址,就需要使用32位的数据来表达,而4个字节,每个字节8位,刚刚32位,刚好可以表达一个地址;因此,只要定义的数据类型是指针类型的数据,则不论什么样的指针类型,它所占用的地址都是4字节的,即不论 int *i;char *i;short *i;int **i;char *i[]等等,都是分配了连续4字节的空间,用于存储一个地址的信息;同样的,这个变量本身的地址指向这个连续4字节的首地址。

定义一种数据类型的变量后,通常情况下我们是直接使用这个变量的值,而不是使用这个变量的地址,比如,int i=30;当我们使用i时,就是使用i变量的值,也就是30这个值,而不是i的地址&i;而对于指针变量,由于变量所存储的值是地址(另一个变量的地址),因此,我们如果要使用这个变量,那么我们需要使用取值操作,才能把指针变量所指向的变量的地址的值取出来,例子:int i,*j=&i;那么我们定义了一个int 指针变量j,这个变量的值存储了变量i的地址,那么,当要通过指针变量j获得i地址中的值时,需要使用取值操作,即*j这样的操作,它的过程是

1.指针变量j的4字节内存空间中存储了变量i的地址

2.通过取值操作*,把j变量的值(也就是i变量的地址)进行取值操作(即对i变量的地址进程取值操作),从而得到i的值

这里,指针类型的变量跟其他类型的变量的区别在于,指针变量的值是地址值,需要一个取值的操作过程。

你可能感兴趣的:(C/C++)