指针的进阶
目录
指针的进阶
1、字符指针
2、指针数组
3、数组指针
4、&数组名VS数组名
我们看一段代码:
我们在看一段代码:
5、数组指针的使用
写两个代码看一下:
郎一个数组指针的使用:
我们使用数组指针进行实现:
6、数组参数和指针参数
一级数组传参
二级数组传参
一级指针的传参
二级指针的传参
7、函数指针
我们看一段这样的代码:
我们阅读两个有趣的代码:
7、函数指针数组
那么函数指针数组又是什么呢?
那么函数指针数组又是怎么用的呢?
8、指向函数指针数组的指针
9、回调函数
我们先演示一下qsort函数的使用:(我们先手动写一个冒泡排序)
我们先演示一下qsort函数的使用:(我们先了解一下qsort这个函数是如何使用的)
10:指针和数组面试题的解析
**************************************************************************************************************
指针的主题:其实在初阶的指针篇已经接触过指针,我来回想一些概念:
1、指针就是变量,用来存放地址的,地址唯一标识一块内存空间。
2、指针的大小是固定的4/8个字节(32位平台/64位平台)
3、指针是有类型的,指针的类型决定了指针 +- 整数的步长,指针解引用操作的时候的权限。
4、指针运算。
**************************************************************************************************************
进入主题:
1、字符指针
指针通过寻址的方式改变 char类型a的内容
还有另外一种方式:
这组代码特别容易的我们以为是将adsad这一组字符串放到char类型指针变量a里面去了,但实际是:将adsad的首地址a放进了char类型的指针变量里面。printf回将其打印,
直到找到 后停止打印。
郎看这一套笔试题:
这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针。指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同
2、指针数组
指针数组是一个存放指针的数组,比如说:
这段代码实际就是通过数组指针访问了三个数组首元素地址,仿真了一个二维数组。
3、数组指针
数组指针的定义:数组指针是指针?还是数组呢?——》答案:肯定是指针的。
我们已经熟悉过:
整型指针:int* point 是指向整型数据的指针。
浮点数指针:float* pointf是指向浮点数数据的指针。
那么数组指针应该就是能够指向数组的指针。
解释:int (*p)[10];
p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组,所以p是一个指针,指向一个数组,称为数组指针。
但是这里要注意:[ ]的优先级要高于*号的,所以必须加上( )来保证p先和*结合。
4、&数组名VS数组名
比如: int arr[10];
对于arr和&arr分别是啥呢?我们都知道arr是数组名,数组名表示数组首元素的地址,那&arr数组名到底是啥?
我们看一段代码:
我们测试发现数组名和&数组名打印的结果是一样的。
那么难道这两个真的是一样的吗?
我们在看一段代码:
很久上面我们可以发现:arr和&arr,虽然值是一样的,但是含义是不一样的。
实际上:&arr表示的是数组的指针,而不是数组首元素的地址(体会一下两者的区别)
在本案例中&arr的类型是:int ( *)[10],是一种数据指针类型。
数组的地址+1,跳过了整个数组的大小,所以&arr+1相对于&arr的差值是40字节;
5、数组指针的使用
数组指针是如何使用的呢?
既然数组指针指向的是数组,那数组指针中存放的应该是数组的地址。
写两个代码看一下:
对于上面的代码,实际上在正常使用的时候我们是不会这样使用的,看看下面的这一个代码是不是更简洁呢?
郎一个数组指针的使用:
我们使用数组指针进行实现:
当然实际上*((*p+i)+j) 实际上相当于就是 ->p[i][j]
p的类型:int(*)[5]
p是指向一个整型数组的,数组5个元素int[5]
郎学了指针数组和数组指针我们来一起回顾并看看下面代码的意思:
6、数组参数和指针参数
在写代码的时候后难免要把【数组】或者【指针】传给数组,那函数的参数应该如何设计呢?、
一级数组传参
二级数组传参
一级指针的传参
二级指针的传参
7、函数指针
数组指针是指向数组的指针,函数的指针就是指向函数的指针。
我们看一段这样的代码:
那么函数指针的类型如何存储呢?----实际和数组指针是非常相似的
那么函数指针应该如何用呢?
那么函数指针有什么用呢?
当然这种写法我们还可以多定义几个同样函数测试看一下结果:
我们阅读两个有趣的代码:
第二个代码:
当然其实代码也是可以简化的:
那么函数指针 -- 有什么用呢(写一个简单的程序体会一下 -- 计算器)
这一个小的计算器程序,看似很简单,但是switch语句中的代码是不是很冗余呢?????
那我们用函数指针来把他优化一下!
以上的代码写出来利用了calculator这个函数省去了很多的冗余代码!
7、函数指针数组
我们都知道数组是一个存放相同类型数据的存储空间,那我们已经学过指针数组了 比如:
那么函数指针数组又是什么呢?
那么函数指针数组又是怎么用的呢?
那这样的话,我们可以对计算器进行一个改版!
看一下这样的代码是不是更加简单呢 - 我们在此代码中利用了 ---> 转移表
8、指向函数指针数组的指针
这个概念我已经被绕晕了,这个知识点简单提一下,【指向函数指针数组的指针是什么呢?】
这个知识点用的也确实比较少,后面我们在仔细研究!
9、回调函数
回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针函数被用来调用其所指向的函数时,我们就说
这是回调函数,回调函数不是由该函数的实现方直接调用,而是 在 特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行相应。
我们先演示一下qsort函数的使用:(我们先手动写一个冒泡排序)
我们先演示一下qsort函数的使用:(我们先了解一下qsort这个函数是如何使用的)
qsort :对一个范围内的拥有一定未指定类型的元素排序
qsort函数实际也可以比较其他类型的函数,比如说:我们比较一个结构体的数据类型;
那我们先了解另一个函数 ---> strcmp()这个函数:
qsort这个函数是不是很好用啊,那我们尝试着将qsort这个函数模拟一下吧!
继续写出求结构体的模拟函数!
10:指针和数组面试题的解析
.............未完序列



