数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,指针是保存这个地址的变量,本篇文章带你掌握C语言指针的用法
前言
指针是C语言中的一个重要概念。正确而灵活的运用指针,可以使程序间接、紧凑、高效。每一个学习和使用C语言的人,都应当深入地学习和掌握指针。
提示:以下是本篇文章正文内容,下面案例可供参考
一、指针是什么?
指针是包含内存地址的变量,这个地址是内存中另一个对象(通常是另一个变量)的位置。例如如果一个变量包含另一个变量的地址,我们说第一个变量指向第二个变量。
相信大家看到上面这段话,可能有点懵,不急,我稍后再给大家解释。在这里,我先给大家讲述一下,数据在内存中是如何存储和读取的?
1.数据在内存中的存储
如果在程序中定义了一个变量,在对程序进行编译的时候,系统就会给这个变量分配内存单元。编译系统根据程序中的定义的变量类型,分配一定长度的空间
那么,这些字节在内存中被分配到哪里?我们如何找到呢?
为了解决这个问题,我们就给内存区的每一个字节一个编号,这个就是它们的“地址”。它相当于旅馆中的房间号,在地址所标志的内存单元中存放的数据则相当于旅馆房间中居住的旅客。
所以指针是个变量,存放内存单元的地址(编号)
2.一个小的单元到底是多大?
1、对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0);
2根地址线上的电信号转换成数字信号用(1/0)表示,所以可能性
00000000000000000000000000000000–11111111111111111111111111111111
也就是有2^32 编号,说明可以管理2的32次方个单元
这里就有2的32次方个地址。
每个地址标识一个字节,那我们就可以给
(2^32Byte == 2^32/1024KB == 2^32 /1024/1024MB==2^32/1024/1024/1024GB == 4GB) 4G的空闲进行编址。
按照同样的方法,我们可以计算出64四位机器,下面就直接给结论了。
1、在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所 以一个指针变量的大小就应该是4个字节。
2、在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址
指针的大小在32位平台是4个字节,在64位平台是8个字节。
二、指针变量
1.什么是指针变量
思考一个问题,在编译器中,如何把3赋值给i这个变量中?
第一种作法,把3直接送到i所表示的单元中,例如“i=3”;
第二种方法,把3送到变量p所指向的单元(即变量i的存储单元,也就是地址,如p=3,其中i表示p指向的对象)
2.指针类型
思考一个问题:
把int型变量a和float型变量b先后分配到2000开始的存储单元中,&a和&b的信息完全相同吗?
答案是不相同的,因为虽然存储单元的编号相同,但他们的数据类型不同。
此外,还因为数据类型的不同,无法确定是从一个字节中取信息(字符数据),还是从两个字节取信息(短整型),抑或是从四个字节取信息(整型),不同的类型,存储方式是不一样的。
如果我们要将&num(num的地址)保存到p中,我们需要我们给指针变量相应的类型。
如下:
这里可以看到,指针的定义方式是: 类型名 * 指针变量名 。
【总结】
C语言中的地址包括位置信息(内存编号,或称纯地址)和它所指向的数据的类型信息,或者说它是“带类型的地址”,如&a,一般称它位“变量a的地址”,但是确切地说,它是“整型变量a的地址”
3.指针类型的作用
作用一:
指针类型决定了指针解引用操作的时候,一次访问几个字节(访问内存的大小)
指针类型的意义1
指针类型决定了指针解引用操作的时候,一次访问几个字节(访问内存的大小)
char* 指针解引用访问1个字节
int* 指针解引用访问4个字节
作用二:
指针类型决定了,指针±整数的时候的步长(指针±整数的时候,跳过几个字节)
三、野指针
1.什么是野指针
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
什么意思?举个例子
就是你捡到一把钥匙,但是不知道它可以开那道门。
2.野指针成因
2.1. 指针未初始化
指针没有初始化,里面放的是随机值
2.2指针越界访问
指针越界造成野指针问题
2.3指针指向的空间释放
当一个指针指向的空间释放了,这个指针就变成野指针了
3.如何规避野指针
- 指针初始化
- 小心指针越界
- 指针指向空间释放即使置NULL
- 避免返回局部变量的地址
- 指针使用之前检查有效性
四、指针运算
1.指针±整数
也就说,如果加2使它向右移动2个元素的位置,依次类推。把一个指针减去2使它向左移动2个元素的位置。
2.指针-指针
1、指针减去指针的前提,是两个指针指向同一块区域
2、指针减去指针,得到数字的绝对值,是指针和指针之间元素的个数
【注意】
指针与指针之间不能进行加法运算,因为进行加法后,得到的结果指向一个不知所向的地方,没有实际意义
什么意思,举个例子。
五、指针和数组
1.数组元素的指针
一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。
指针变量既然可以指向变量,当然也可以指向数组元素,也就是把某一元素地址放到一个指针变量中。
所谓数组元素的指针就是数组元素的地址
(1)用一个指针变量指向一个数组元素
以上是使指针变量p指向a数组的第0号元素
2.通过指针引用数组元素
(1)下标法,如a[i]形式
(2)指针法,如*(a+i)
下标法:
指针法:
一个小知识:
六、二级指针
指针变量的地址二级指针
什么意思?举个例子
七、指针数组
存放指针的数组就是指针数组
我们也可以用同样的方式来访问指针数组。
如下
最后
本文介绍的是指针的基础知识,往后还会继续深入讲解指针更深入的知识。此外,本文参考了谭浩强《C语言设计》(第五版),以及网上的部分资料,加之自己在学习听课时的笔记,梳理而成,花费了我很多心思。当文章写成之时,时间已过去4个多小时!
希望能对看到的大家有所帮助!
以上就是C语言指针必备基础全面覆盖的详细内容,更多关于C语言 指针的资料请关注编程学习网其它相关文章!