C语言初学者小秦的Blog(4)

指针在C语言中是重点也是难点,让我们来看看吧~

指针的概念

一个专门用来存放内存地址的变量,指针也就是指针变量。

地址:比如 &a 是一个地址,也是一个指针,&a 指向变量 a

专门用于存储地址的变量,又称指针变量。

格式

类型 *指针变量名

 “类型” : 指针变量指向的内存空间存放的数据类型

“指向” : 如果我保存了你的地址,那么就说我指向你

 “*” :定义指针变量的固定格式

指针的尺寸

指针尺寸指的是指针所占内存的字节数

指针所占内存,取决于地址的长度,而地址的长度则取决于系统寻址范围,即字长

结论:指针尺寸只跟系统的字长有关,跟具体的指针的类型无关

在32位系统,指针的大小占用4字节

在64位系统,指针的大小占用8字节

野指针

概念

指向一块未知区域的指针,被称为野指针。野指针是危险的。

危害

1. 引用野指针,相当于访问了非法的内存,常常会导致段错误(segmentation fault) 

2. 引用野指针,可能会破坏系统的关键数据,导致系统崩溃等严重后果

产生原因 

1. 指针定义之后,未初始化

2. 指针所指向的内存,被系统回收

3. 指针越界

如何防止

1. 指针定义时,及时初始化

2. 绝不引用已被系统回收的内存

3. 确认所申请的内存边界,谨防越界

空指针

很多情况下,我们不可避免地会遇到野指针,比如刚定义的指针无法立即为其分配一块恰当的内存,又或者指针所指向的内存被释放了等等。一般的做法就是将这些危险的野指针指向一块确定的内存,比如零地址内存。

概念

空指针即保存了零地址的指针,亦即指向零地址的指针。

数组与指针

数组名有两个含义:第一个含义,表示整个数组

                                 第二个含义,表示首元素地址

数组与指针转换

数组指针:数组的指针的本质为指针,此指针保存的是数组的地址,说白了就是,指针指向数组名,此类指针称为数组指针

指针数组: 指针的数组的本质为数组,数组里面存放的内容为指针,而一般指针是指向的地址为字符串居多,我们把此类型称为指针数组

字符串与指针:字符串常量在内存中实际就是一个匿名数组

                         匿名数组满足数组的两个条件 1.第一个含义,表示整个数组   

                                                                          2.第二个含义,表示首元素地址

常见问题:

问:数组是不是就是地址?

答:有时候是,有时候不是。在C语言中非常重要的一点是:同一个符号,在不同场合,有不同的含义。 比如 数组 int a[3]; 当出现在以下三种情形中的时候,它代表的是一块12字节的内存: 初始化语句时; int a[3]与 sizeof 结合时; sizeof(a) 与取址符 & 结合时; &a 只有在上述三种情形下,数组 a 代表一片连续的内存,占据12个字节,而在其他任何时候,数组 a 均会被一律视为其首元素的地址。 因此,不能武断地说数组是不是地址,而要看它出现的场合。

问:指针不是地址吗?为什么还可以取地址?地址的地址是什么意思?

答:概念混淆。首先需要明确,指针通常指指针变量,是一块专用于装载地址的内存,因此指针跟别的普通变量没什么本质区别,别的变量可以取地址,那么指针变量当然也可以取地址

char型指针

char型指针实际上跟别的类型的指针并无本质区别,但是由于C语言中的字符串以字符数组的方式存储,而数组在大多数场合又会表现为指针,因此字符串在绝大多数场合就表现为char型指针

多级指针

如果一个指针变量p1存储的地址,是另一个普通变量a的地址,那么称p1为一级指针

如果一个指针变量p2存储的地址,是指针变量p1的地址,那么称p2为二级指针

如果一个指针变量 p3 存储的地址,是指针变量 p2 的地址, 那么称 p3 为三级指针

以此类推,p2、p3等指针被称为多级指针

void型指针

概念:无法明确指针所指向的数据类型时,可以将指针定义为 void 型指针

要点: 1. void 型指针无法直接索引目标,必须将其转换为一种具体类型的指针方可索引目标

            2. void 型指针无法进行加减法运算

void关键字的三个作用: 1. 修饰指针,表示指针指向一个类型未知的数据。

                                        2. 修饰函数参数列表,表示函数不接收任何参数

                                        3. 修饰函数返回类型,表示函数不返回任何数据。

const 型指针

const型指针有两种形式:①常指针 ②常目标指针

1. 常指针:const修饰指针本身,表示指针变量本身无法修改。

2.常目标指针:const修饰指针的目标,表示无法通过该指针修改其目标

函数指针

概念:指向函数的指针,称为函数指针。

特点:函数指针跟普通指针本质上并无区别,只是在取址和索引时,取址符和星号均可省略

要点:1. 函数指针是一类专门用来指向某种类型函数的指针。

           2. 函数的类型不同,所需要的函数指针也不同。

           3. 函数的类型,与普通变量的类型判定一致,即去除声明语句中的标识符之后所剩的语句。

常见问题:

问:一维数组会被视为一级指针,那 二维数组是不是等价于二级指针?

答:这种说法是错误的,不能这么简单的类推,实际上,二维数组与二级指针没有任何必然关系。任何数组a,除了定义语句和sizeof表达式之外,都会被一律视为一个指向其首元素的指针,因此,除非该数组的元素类型本身恰好是指针,即一维指针数组在运算时会被视为二级指针, 但题目中提到的二维数组,其元素显然应该是一维数组,因此 二维数组在运算时会被视为指向数组的指针,即数组指针。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值