C语言绝对值得一看的常识讲解:指针篇 篇1

指针是C语言中最重要的概念之一,也是C语言汇总最具有特色的内容。指针是C语言的一种数据类型,不同于前面介绍的基本类型和构造类型,这种数据的变量存放的是内存地址的值。正确而灵活地使用指针,可以动态地管理内存,方便地使用字符串,表示更为复杂的数据结构,有效地使用数组,调用一次函数而得到多个值(一般函数调用至多只能得到一个值)。本篇文章主要介绍指针与指针变量,指针变量的定义等内容。

目录

1.指针变量的定义和初始化

1.1指针与地址

1.2指针变量的定义

1.3指针变量的初始化

2.指针变量的操作

2.1指针变量的赋值

2.2指针变量的算术运算

2.3指针变量的关系运算

3.指针所指变量的操作


1.指针变量的定义和初始化
1.1指针与地址

计算机的存储器是由若干个字节顺次组成的,每个字节对应一个编号。编号按自然顺序排列,每个字节的编号称为该字节的地址。数据存放在存储器的字节中。一般,不同类型的数据所占用的内存字节数是不同的。

根据内存单元的编号可以准确地找到相应的内存单元,内存单元的编号称为地址,通常我们把这个地址称为指针。大家可以类比小区中的门牌号记忆,即小区相当于计算机存储器,每一个字节内的内容相当于业主的家,而字节的编号则相当于门牌号,也就是地址,当我们知道某位业主家的门牌号,就可以找到他的家,并有机会使用他家中的物品(字节内存储的内容)

如下图“国子监街”可以看作计算机的存储器,“28号”就是我们要去的住宅可以看作地址,“28号”中的珍贵物品就是地址指向的内容(存储的数据)。

一般地,定义变量时,系统根据变量的数据类型自动地为变量分配一定的内存单元(连续的若干个字节)。在这些内存单元中,可以存储数据。所存储的数据(变量的值)是以二进制形式表示,称为变量的内容。变量所分配的内存单元的首地址,称为该内存单元的指针。由此我们易知,内存单元的内容相当于上面说的“业主家中的物品”,内存单元地址相当于“业主家的门牌号”,两者是不同的概念。

变量的指针,即变量所占用的内存空间的首地址,用十六进制的整数表示,这种数据也是可以被存取的。(可以理解为某业主把老家的门牌号信息放在新家中,即新家中的物品是老家的门牌号信息)C语言允许用一种特有的变量来存放普通变量的指针,这种特有的变量称为指针变量。指针变量的值就是某个普通变量的地址。此时也称为指针变量指向该变量。

1.2指针变量的定义

在C语言中,指针变量同其他变量一样,也需要先定义后使用。

定义指针变量的一般形式如下:

类型名 * 指针变量名;

 其中,类型名是指该指针变量指向内存单元的数据类型(也称基类型),可以是任意合法的数据类型:“*”称为指针定义符,用来说明指针变量以区别于普通变量;指针变量名是合法的标识符。

定义一个指向基类型的指针变量,编译器为指针变量分配内存空间。指针变量存放的是一段内存空间的起始地址,因此,所有指针变量都占用相同大小的存储空间,具体占有的存储单元数于计算机系统和编译器有关。

1.3指针变量的初始化

在定义指针变量时,如果没有给指针变量赋初值,则指针变量是“值无定义的”,指针变量的值是一个随机数,可能指向内存中的任何位置,这种指针称为野指针。野指针在程序中是很危险的,可能导致系统崩溃。

定义指针变量后,必须将该指针和一个特定的内存地址进行关联,然后才可以使用指针,也就是说,指针变量要处于“值有定义的”状态才可以使用。在定义指针变量的同时赋初值称为指针变量的初始化。

初始化指针变量的一般形式如下:

类型名 * 指针变量名 = 内存地址;

其中,内存地址是某个变量的存储地址,或是另一个“值有定义的”同类型指针。

定义一个指向基类型的指针变量,并将内存地址存储在指针变量中,其结果是指针变量指向了该内存的地址,换句话就是说一个内存单元的内容是另一个内存单元的地址。

如果在定义指针变量时无法与某个具体的内存地址进行联系,可以将其初始化为空指针NULL。空指针不指向任何内存单元,可以避免无法预料的错误发生。

2.指针变量的操作
2.1指针变量的赋值

给指针赋值是使指针和该指针指向内存单元之间建立关联的必要过程。指针变量可以在程序中赋值,即将一个内存地址存入指针变量。

指针变量赋值的一般形式如下:

指针变量=内存地址: 

 将内存地址存储在指针变量中,其结果使指针变量指向了该内存地址。

注意:

①与指针变量的初始化相同,指针变量的赋值需要注意赋值的相容性,只有基类型相同的指针变量才可以相互赋值。

②通常不允许将一个整数赋值给指针变量。例如,让指针p指向地址为100的内存单元,这是内存的低端,通常用来存储系统资源,对该内存单元的操作可能会引起系统错误,严重的可能会产生死机等现象。

2.2指针变量的算术运算

指针变量的算术运算包括指针与整数的加减运算,以及两个同类型指针的减法运算。对指针变量加上或减去一个整数,表示将该指针后移或前移确定的存储单元确定的存储单元实际上就是该指针的基类型所占用的字节数),对两个同类型的指针进行减运算,表示两个指针间有多少存储单元。

int sum,a[5]={1,2,3,4,5};

int *p=a;//大家应该知道这里的数组名是数组首元素地址吧,即a[0]的地址

int *q=NULL;

q=p+4;//按照上面说的就是后移4个确定的存储单元,这里其基类型是int,那么每个就是4个字节 原式等价于q=p+4*sizeof(int);

sum=q-p;//相减得到有多少个存储单元,那么就用地址之差除以每个存储单元的大小,说白了就是两地址间的基类型元素个数

对指针变量加上或减去一个浮点数,或对两个指针变量进行加、减、乘、除等算术运算通常是没有实际意义的。

2.3指针变量的关系运算

指针变量的关系运算是在同类型的指针之间进行比较运算。假设p、q是两个同类型的指针变量,则表达式p==q判断p和q是否指向同一存储单元;表达式p!=NULL判断指针p是否是空指针;表达式p>q判断p所指存储单元是否在q所指存储单元的高端。

3.指针所指变量的操作

可以通过指针对指针所指存储单元进行访问,这种访问方式称为间接访问。C语言通过解引用运算符*访问指针所指存储的单元(我们通过门牌号找到了一间屋子,再拿出钥匙,就可以取出屋子中的东西了,“*”的作用就可以理解为我们把门牌翻转,得到了屋子的钥匙,然后就可以对屋内的物品操作了

间接引用运算符*的一般形式如下:

*指针变量//只能是指针变量哦(只对门牌翻转才能有用啊,钥匙就藏在门牌后面呢)

 其中,“*”是解引用运算符;*的后面只能是指针变量,并且该指针变量必须之下指向某个确定的存储单元。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值