在学习指针变量之前,我们先来了解一下变量的地址。
当我们定义变量的时候,计算机会为变量分配内存空间,比如说定义一个int类型的变量,那么计算机会分配4个字节的内存空间给这个变量。假如我们定义了两个int类型的变量a和b,那么它们就可能会像是这样子在内存中排列。
那么,每个int型变量都有四个字节编号,计算机到底以哪个字节编号作为变量的地址呢?当然是起始的字节编号。只要知道了起始的字节编号,那么只要根据变量的类型就知道接下来哪些字节是属于这个变量的了。
在这里我们先要注意的是,变量的地址不是不变的,每一次编译时,同一个变量的地址是不同的。
好了,讲完这个变量的地址,我们就来讲讲指针。
指针变量就是用来存放另外一个变量的地址的变量。比如说有一个变量p,一个变量a,将a的地址赋值给p,那么这样就可以说p指向了a,p就称为“指针变量”。因此,简单来说,指针变量就是存放另一个变量的地址信息的一个变量。
指针变量的定义格式 : 类型 *指针变量名;
例如:
int *i; //定义int型的指针变量i
char *a; //定义char型的指针变量a
long *b; //定义long型的指针变量 b
为什么指针变量也会有类型呢?因为指针变量的类型决定了指针后续能指向哪种类型的变量。
因此指针变量会包括这两方面的内容:
1.变量的地址(确定被指向的变量的首地址)
2.变量的类型(确定被指向的变量占用的字节数)
(引申内容)
二次指针:指针变量里面装着另一个指针变量。
例如:
//定义了二次指针p,指针变量p1,int型变量a
int **p,*p1,a=20;
//p1指向了a,p指向了p1
p1=&a,p=&p1;
指针变量的赋值方式
(1)用&运算符获得地址
int a,*p;
p=&a;
(2)通过指针变量获得地址值
解释:把一个指针变量中存放的地址赋给另一个指针变量 ,这样这两个指针变量就共同指向同一个变量的地址。
int k=1,*p,*p1;
p=&k,p1=p;
特别注意的是,指针指向数组的时候不需要用到&运算符,只需要将数组名作为值赋值给指针就可以了。因为数组名代表的就是数组的首地址。
说了这么多,这个指针变量到底有什么用呢?实际上,我们可以利用指针变量实现间接读写被指向的变量。这时候我们需要用到*运算符,用法就是*后面接一个地址或者指针变量。这样,就可以间接访问该地址或者该指针指向的变量的值。比如说下面的代码:
//定义变量a并初始化,定义指针变量p
int a=10,*p;
//p指向a
p=&a;
/*通过间接访问运算符访问a变量的值,
此时的赋值操作就相当于给a赋值
*/
*p=90;
那么根据指针这个神奇的用处,我们还可以延展出一些更加实用的函数,就比如说实现变量a和变量b的值交换:
void Swap(int *a,int *b){
int t=*b;
*b=*a;
*a=t;
}
当调用这个函数的时候,我们只需要传入a和b变量的地址,就可以完成a和b变量的值交换,是真正的实现了值交换哦!
指针的移动
含义:对指针变量加减一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。
例如:
int a,*p;
p=&a;
p=p+1;
那么这个指针自增1在内存中怎么表示呢?
所以说,指针加或减1的含义就是 指针新值=指针原值+/-sizeof(指针所指变量的类型)。
指针的移动一般用于当指针指向数组的时候,因为数组元素是有序排列在内存中的,这样当指针移动的时候就会自动指向下一个数组元素。
好了,C语言的指针变量就学习到这里了。