目录
1.指针与地址
2.指针与变量
3.指针变量
(1.指针与地址)
想要了解指针,我们必须要了解两个问题:
1.数据在内存里如何存储
2.数据在内存里如何读取
了解了这两个知识点,就很好理解了~
首先第一个问题,数据在内存里如何储存:
系统里的内存就像是餐厅里带有编号的桌子,每个桌子都有自己的编号,如果需要使用内存,就需要得到桌子的编号。定义一个整型变量i,整型变量需要4个字节,故编译器会为变量i分配编号从1000~~1003.
地址就是每个字节的编号,1000,1001,1002…就是地址。我们可以从下一个图进一步说明。
上图中1000,1004就是内存单元的地址;0,1就是内存单元的内容。也就是说,一个整型变量i占4个字节,它的起始地址就是1000,它的内容是0;整型变量j的起始地址是1004,,它的内容是1。
那指针是什么呢?我们可以把指针看成是内存里的地址,在多数情况下,这个地址是内存里的一个变量的位置。
第二个问题是数据在内存里如何读取:
在c语言中,存取变量的值有两种方法,一种直接访问:通过按变量地址存取变量的值;第二种是间接访问:通过把变量i的地址存放在另外一个变量P中,通过变量P找到变量i的地址。这第二种方法就是通过指针变量来实现的。
2.指针与变量
如果一个变量P包含了另外一个变量i的地址,那么,变量P可以说是指向变量i的,所谓的指向就是通过地址来体现的,我们用*来表示指向。用一句话来说就是:指针变量P是用来存放变量i的地址的,变量i的地址赋值给指针变量P后,这个指针变量p就指向该变量 i。
这里简单说一下变量是如何在内部运作的,假设我们进行如下操作:
int i,j;
i+j; //变量i和j在内部如何运作呢?
变量i和j在内部如何运作呢?系统根据变量名和地址的关系,找到变量i的地址,从1000开始读取四个字节的数据存放在寄存器里,再找到j的地址1004开始读取四个字节数据存放在寄存器中,通过CPU的加法中断计算出结果。
3.指针变量
指针变量我们可以拆开来看,一个是指针,一个是变量。和我们所知道的int整形,char字符型,float浮点型等类型的变量一样,指针也是一种类型。用一句话来描述就是:有一个变量A保存有一个变量B的地址,那么变量A就是指针变量。而一个变量A需要存储变量B的地址,我们就需要用:类型说明*变量名这种格式去定义。(指针变量其实和普通变量没有任何区别,类型只是对其所修饰的数字或者符号所代表内存空间的长度和解析方法的规定。)
定义指针变量和赋值:
int a=1;
int *p=&a;//&是取地址运算符,将a变量的地址赋值给指针变量P。
上面是指针变量的定义和赋值,那么定义和赋值后,p与*p分别代表什么意思呢?我们执行下面一段代码:
int a=1;
int *p=&a;
printf("%d\n",p);
printf("%d",*p);
得到的结果为 6422036 和 1。也就是指针变量p所储存的内容为变量a的地址 6422036,*p表示为引用指针变量所指向的值1。