从头开始学C语言第二十三天——指针概念
使用指针可以使程序简洁高效,有效表达复杂数据结构,动态分配内存空间,得到多余一个的函数返回值。
地址
在理解指针之前,先对计算机内存中的地址做一定了解。在计算机内存当中,以字节为单位,每一个字节单元都有对应的编号。这个编号称为地址。
如下图所示,左边表示的是计算机内存,前面的数字就是我们所说的字节单元编号,也就是地址,右边的char a,short b,int c是相应的数据,前面的数据类型我们可以知道char占用1个字节,所以占一个字节单元,short占用2个字节,所以需要占两个字节单元,因此占用了102,103两个单元。以此类推。
编译或者调用函数为变量分配内存;变量其实是对程序当中数据存储空间的抽象。因为在计算机中数据是以地址的方式存储,变量名只是方便我们去理解和操作。
在访问或者调用数据的时候我们有两种方式,一种比较直接,我们已知内存中该变量的变量名称,且内存中只有1个这个变量名称,我们可以直接搜索变量名称来找到我们需要调用的变量;另一种我们可以通过访问该变量所在地址的方式去找到和调用变量。以上图为例,假如说我们知道内存中名称是a的变量只有一个,那我们可以直接通过搜索a这个名称的变量找到并调用;或者我们可以搜索a变量所在的内存单元101,也可以找到并调用a。
指针概念
在C语言中,内存单元的地址被称为指针,用来专门存放地址的变量,有时对地址,指针和指针变量不做区分,简单来说就是地址=指针。
指针变量
格式:<存储类型> <数据类型> *<指针变量名>;
例如:char *pa;(在变量名前+p,用于说明该变量为指针变量,不是数据变量)
注意:
指针的存储类型是指针变量本身的存储类型
指针说明时,指定的数据类型不是指针变量本身的数据类型,而是指针目标的数据类型,简称指针的数据类型。
指针的说明时,也可以被赋值,称为指针的初始化
一般形式:
<存储类型> <数据类型> <指针变量名> = <地址量>;
int a=3;//int a定义整型变量a;a=3对a初始化,赋值为3
int *pa = &a;//int *pa定义整形指针*pa;*pa = &a表示将a的地址作为初值赋值给指针*pa
#include <stdio.h>
int main()
{
int a=10;
int *pa = &a;
printf("%p %p",pa,&a);
printf(" %p",&pa);
printf(" %d %d",a,*pa);
printf(" %d",sizeof(pa));
return 0;
}
定义了一个变量:a,初值为10,存放数据的地址在103;
定义了一个指针:*pa,初值为103,即a数据存放的地址,该指针变量的地址为207。
因此,我们在访问地址的时候有两种方法:
printf("%p %p",pa,&a);pa的数据就是a的地址,也可以通过&a直接获得地址
printf("%p",pa);表示的是指针变量pa所存放的地址