C语言指针进阶

目录

一、指针的概念

1.1 什么是指针

1.2 关于内存

1.2.1 内存中的编号

1.2.2 电脑内存

1.2.3 内存申请空间

1.2.4 内存的数据表示

1.3 关于地址

1.3.1 打印地址

1.3.2 存储地址

1.4 指针属性

1.4.1 指针变量大小

1.4.2 指针初始化

1.4.3 指针类型

1.5 野指针

1.5.1 野指针成因

1.5.2 避免野指针

1.6 指针运算

1.6.1 指针加减整数

1.6.2 指针减指针

1.6.3 指针的关系运算

1.7 数组与指针之间的关系

1.8 二级指针

二、字符指针

2.1 指向字符串的指针

2.2 字符串的地址

三、指针数组

四、数组指针

五、数组参数与指针参数

5.1 一维数组传参

5.2 二维数组传参

5.3 一级指针传参

5.4 二级指针传参

六、函数指针

6.1 函数名的意义

6.2 函数指针的声明

6.3 函数指针的用法

6.3.1 一段有趣的代码

6.3.2 typedef 重命名

6.4 函数指针的用途

七、函数指针数组

7.1 函数指针数组的创建

7.2 函数指针的调用

7.3 函数指针数组的运用


一、指针的概念

  1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
  2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。
  3. 指针是有类型,指针的类型决定了指针的+﹣整数的步长,指针解引用操作的时候的权限。
  4. 指针的运算。

1.1 什么是指针

指针理解的2个要点:

  1. 指针是内存中一个最小的单位的编号,也就是地址。
  2. 平时口语说的指针,通常指的是指针变量,是用来存放内存地址的变量。

1.2 关于内存

内存空间如何管理的呢?

切割成内存单位 -- 1byte(字节)

1.2.1 内存中的编号

内存会划分为一个个的内存单元(一个内存单元的大小:1byte)每个内存单元都有一个编号

5c49de5417e7426990895b4b0300b569.png

1.2.2 电脑内存

b8584b576ce74f6396ad17cd90746422.png

32位的电脑内存4g

ca281f61a15a4c8d80e8586acc3a43a8.png

1.2.3 内存申请空间

2c81f6054dc94e1e956112d44f76ddf4.png

84c9538e1fb84a5e9ec7eb13f9268022.png

当&a(取地址)时,得到的是首元素地址。

1.2.4 内存的数据表示

9d109b62593e4423b9ad3ad39c24ab62.png

16进制表示10:a

bb987042010f413597a173e753ad269c.png

1.3 关于地址

1.3.1 打印地址

38ec43b0b83245839a9e63c28dc0a206.png

用%p打印地址,以16进制表示

1.3.2 存储地址

b8df8a3fe30947b5b95b019418d5d12e.png

注意:p1是指针,p2,p3是整形,p2,3前面加*(*p2,*p3)才是指针

f2ff160b3d1740ba80659dc5bca61397.png 453564440dc644f9a7c3eb4015777bc6.png

 详细

b09e345c3ab04b34b6bc38f03697edcb.png

1.4 指针属性

d3a4d9e87e064658a24e081141aa5a79.png

&取地址,*通过地址再找回去,一来一去。

1.4.1 指针变量大小

建议用%zu——无符号整形打印

917bff8618fb456a8ea88a392d32a05b.png

在32位机器(X86位环境)上打印都是4(字节)

在64位机器(X64位环境)上打印都是8(字节)

1.4.2 指针初始化

int *p = NULL;

f21287870e4440d294a8cf73d4f2d471.png

1.4.3 指针类型

如果32位机器指针都是4字节,64位机器指针都是8字节,那么指针的类型还有必要吗?

bd42deea9e434b1db526a406697dc0ea.jpg

char*类型可以存下int*类型的地址,但是使用方式不一样。当我们解引用把pc变量覆盖成0时,因为char*类型的原因,只处理了一个字节。

所以,指针类型决定了指针在被解引用的时候访问几个字节。

c81cc085ab434c17939936fe5668069c.jpg指针步长会根据指针类型变化。那如果int*和float*是不是可以通用啊?不能

a16d519fc3954eb49b2ea2318f08d4b2.jpg 可以看见存放的数值不一样。

7e78176f5d354290bc172cac37025c15.jpg int和float在内存的存储方式是有差异的。

总结指针类型的意义:

  1. 决定了指针在被解引用的时候访问几个字节。
  2. 决定了指针的步长。

1.5 野指针

概念:

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

1.5.1 野指针成因

1.指针未初始化

a4e382c3247f43a79e5c474527b5a013.jpg

2.*p访问了不属于我们的地址。

指针越界访问

fb279896152843eba4d6994a95c639df.jpg

3.指针指向的空间释放

d9852dfd8a9648fb8fe9171547f5b2ff.jpg

变量a是局部变量,出了局部范围就销毁了。但是指针变量p存储了已经销毁了的变量a的空间,如果再解引用使用这空间就是非法访问了。

1.5.2 避免野指针

int* p = NULL;

03e77d175c704fa4b725bbbc989961a0.jpg

0地址不能访问。

ef6d225019c6419e9df34e7b874c30a6.jpg

不是空指针时,解引用。

指针初始化

  1. 小心指针越界
  2. 指针指向空间释放及时指NULL
  3. 避免返回局部变量的地址
  4. 指针使用之前检查有效性

1.6 指针运算

  • 指针 +- 整数
  • 指针
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值