指针的基本概念
简单的来说,指针就是内存单元的地址。它可能是变量的地址也可能是数组的地址,亦或者是函数的入口地址。而存储地址的变量就是指针变量,通常称为指针。
再简单的来说也比较迷吧,举个例子,去酒店住房间,酒店里的每个房间会有一个房间编号是不是,每个房间又有一个房间名![在这里插入图片描述]而你去住酒店的时候,前台会给你一个房卡,你可以拿着房卡去找到你的房间。来看图
程序中所使用的任何数据都会在计算机存储空间中占用一定长度的内存空间,计算机的内存空间被分成一个个以字节为单位的存储单元。
就好比酒店会被分成一个个的房间一样,每个房间就好比是一个存储空间,计算机存数据,房间存实物。
为了正确地访问这些内存单元,必须为每个内存单元编号,内存单元的编号通常被称为地址。
这就是为什么要给每个房间编号,就为了来酒店住的人们可以正确的找到自己的房间。
内存单元的内容称为值,也好比入住酒店的用户信息。
直接引用与间接引用
使用高级语言设计程序的时候,通常会给变量起一个名字,即标识符,比如x。通过标识符(即变量名x)来存取变量的值,这种访问方式称为直接引用。
就好比给予用户10一个临时信息存放名x一样。
在C语言中,可以将一个变量所占内存空间的首地址存放到一个变量p中,然后通过变量p中存储的值也就是地址的值找到变量x所占用的内存空间,间接的访问或修改变量x的值,这种方式称为间接使用。
什么意思呢?就是说用户10拿着房卡px可以找到房间60111也就是房间名为x的房间,而这房卡就是中间量,也就是间接的方式。而房卡可以交给用户10也可以交给用户11,就是既可以访问这个房间也可以修改房间x的信息。
指针的定义和使用
使用指针时需要明确两个概念,指针对象和指针指向的对象。指针对象是明确命名的指针变量,指针指向的对象是另一个变量。
有时我们把存有指针值的变量也成为指针,为了不混淆,我们约定指针式常量,指某个具体的对象所占内存空间的首地址,指针变量是指取值为指针值的变量。
一个指针可以被赋予不同的指针值,即指针变量可以指向不同的对象,但不能同时指向多个对象,因此确定某个指针变量在使用式的指向是非常重要的。
指针变量与其他变量一样需要先定义在使用
指针变量使用来存放其他数据所占用的存储空间的首地址,但不同类型的数据所占用的内存单元个数是不一样的,所以定义时要指明该指针变量所指向的数据的数据类型,通过指针变量间接的引用数据时就能知道数据占用的内存空间大小。定义指针变量的一般形式
类型标识符 *变量名;
int *px;//定义一个指向整型数据的指针变量
float *p1;//定义一个指向实型数据的指针变量
char *P2;//定义一个指向字符类型数据的指针变量
//指针变量的赋值
#include<stdio.h>
void main()
{
int x = 5,*px,*py,y = 10;
//定义整型变量x和y并赋值5,10以及定义指向整型变量的指针px和py
py = &y;//py指向y,也就是把y的地址赋值给指针变量py
px = &x;
printf("x=%d,y=%d,*px=%d,*py=%d",x,y,*px,*py);
y = *px;//将y的值改变为px所指向的变量的值,即y的值被改变为5
printf("x=%d,y=%d,*px=%d,*py=%d",x,y,*px,*py);
*py = 20;//通过指针变量间接的改变y的值
printf("x=%d,y=%d,*px=%d,*py=%d",x,y,*px,*py);
px = py;//将py的值赋给指针变量px,这些px和朋友同时指向y,即值为20
printf("x=%d,y=%d,*px=%d,*py=%d",x,y,*px,*py);
}
运行结果
>>>x=5,y=10,*px=5,*py=10
>>>x=5,y=5,*px=5,*py=5
>>>x=5,y=20,*px=5,*py=20
>>>x=5,y=20,*px=20,*py=20