C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)

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

1. 字符指针

 

代码 char* pstr = "hello bit."; 特别容易让同学以为是把字符串 hello bit 放到字符指针 pstr 里
了,但是/本质是把字符串 hello bit. 首字符的地址放到了pstr中。 

2. 指针数组 

 来看几个指针数组的应用:

 

 3. 数组指针

数组指针是指针

 

 数组名是首元素地址有两个例外:

 

 

 如果传参传过去的是地址:

数组指针的使用: 

   //数组名arr,表示首元素的地址
  //但是二维数组的首元素是二维数组的第一行
  //所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址
  //可以数组指针来接收

再来看看下面代码的意思:

4. 数组参数、指针参数

4.1 一维数组传参

4.2 二维数组传参 

4.3 一级指针传参 

4.4 二级指针传参 

5. 函数指针 

 输出的是两个地址,这两个地址是 test 函数的地址。
那我们的函数的地址要想保存起来,怎么保存?

通过函数指针调用函数的实例:

阅读两段有趣的代码: 

6. 函数指针数组 ‘

先来看一段代码:

如何进行简化呢?使其变为函数指针数组的形式

 使用实例:

设计一个计数器:

1.一般方法:

2.通过函数指针数组改良的简便方法:

 

 7. 指向函数指针数组的指针

指向函数指针数组的指针是一个 指针
指针指向一个 数组 ,数组的元素都是 函数指针

8. 回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一
个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该
函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或
条件进行响应。

首先演示一下qsort函数的使用:

首先来看看void* base的作用

size_t num表示的是待排序的元素个数 

size_t width表示一个元素的大小,单位是字节

注:size_t表示的是无符号整型

 

 接下来我们用qsort函数来自己写一个冒泡排序:

 注:Swap函数里面注意width不能忽略,还要注意每一个字节比较完毕过后都要向后跳一个字节

同时还要注意这个函数使用了回调函数的思想

9. 指针和数组笔试题解析

题目:

 

运行结果:

答案解析:

题目:

运行结果:

解析:

 题目:

答案解析:

 题目:

运行结果:

答案解析:

 题目:

答案解析:

题目:

运行结果:

答案解析:

 题目:

答案解析:

 题目:

运行结果:

答案解析:

总结:
数组名的意义:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址。

4.strlen渴望得到的是一个地址,从传参过去的地址开始向后数,直到\0位置,\0之前有多少个字符就有多长 

5.二维数组的数组名表示首元素地址,但这里的首元素地址指的是第一行的地址;a[0]在二维数组中代表的是第一行的数组名

例子:

int a[3][4];

二维数组的数组名为a;   a-二维数组的首元素地址(第一行)的地址

第一行的数组名是a[0];     a[0]代表第一行第一个元素的地址

第二行的数组名是a[1];     a[1]代表第二行第一个元素的地址

第三行的数组名是a[2];     a[2]代表第三行第一个元素的地址

sizeof(a)         &a

sizeof(a[0])    &a[0]

sizeof(a[1])    &a[1]

sizeof(a[2])    &a[2]    以上四种情况的数组名都表示整个数组

10. 指针笔试题

解析结果:

 题目:

解析结果:这里一定要注意+1到底是什么在+1,注意强制类型转换过后类型的转变

 

 题目:

解析结果:

运行结果:

 

 题目:

 解析结果:

a[0]是第一行的数组名,单独的a[0]表示首元素的地址

 

题目:

 

结果解析:

 

题目:

 

 结果解析:

题目:

 

结果解析:

这里的char**应当如何理解呢?

char* *pa;

前面一个char*表示++会跳过一个char*类型,*pa表示pa是一个指针

 

 题目:

结果解析:

 

 

  

 

 

运行结果:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~|Bernard|

你的鼓励是我写下去最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值