首页 > 其他分享 >指针(进阶)

指针(进阶)

时间:2024-11-15 14:43:47浏览次数:3  
标签:arr 函数 指向 数组 函数指针 指针 进阶

重点讲述:

1.字符指针

2.数组指针

3.指针数组

4.数组传参和指针传参

5.函数指针

6.函数指针数组

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

8.回调函数

1.字符指针

在指针的类型中我们知道有一种指针类型为字符指针char*

一般使用:

还有一种使用方式如下:

代码const char*pstr ="zhu ying.";

有人可能以为是吧字符串zhu ying放到字符函数指针pstr里了,但是本是把字符串zhu ying.首字符的地址放到了pstr中。

既然如此,有一道有意思的题,你们可以先猜猜输出什么:

这里最终输出结果是:

这里str3和str4指向的是一个同一个常量字符串。c会把常量字符串存储到单独的一个内存区域,当几个指针,指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串取初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同

2.指针数组

在上一张指针初阶讲过了,忘记的可以回去看看

3.数组指针

3.1数组指针的定义

数组指针是指针还是数组?

答案是:指针。

我们已经熟悉:
整形指针:int*p能够指向整型数的指针。

浮点型指针:float*p能够指向浮点型数据的指针。

那数组指针应该是:能够指向数组的指针。

下面代码哪个是数组指针?

解释:(用操作符的优先级判断)

int (*p)[10];

p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。

这里要注意:[]的优先级要高于*号,所以必须加上()来保证p先和*结合。

3.2&数组名VS数组名

对于下面的数组

int arr[10];

arr和&arr分别是啥?

我们知道arr是数组名,数组名表示数组首元素的地址。

那&arr数组名到底是啥?
我们看一段代码:

运行结果如下:

可见数组名和&数组名打印的地址是一样的。

难道两个就是一样的吗?

我们再看一段代码:

根据上面的代码我们发现,其实&arr和arr,虽然值是一样的,但是意义是不一样的。

实际上:&arr表示的是数组的地址,而不是数组首元素的地址。(显示是首元素地址,实际却不是)

&arr的类型是:int(*)[10],是一种数组指针类型

数组的地址+1,跳过整个数组的大小,所以&arr+1相对于&arr的差值是4*10=40。

3.3数组指针的使用

那数组指针是怎么使用的呢?

既然数组指针指向的是数组,那数组指针中存放的应该是数组的地址。

看代码:

p=&arr,所以*p=*&arr,因为*&可以互相抵消,变成*p=arr,所以要取出arr里面的整型直接*p[数字];

一个数组指针的使用:

学了指针数组和数字指针我们来一起看一下下面代码的意思:

4.数组参数、指针参数

在写代码的时候难免要把【数组】或者【指针】传给函数,那函数的参数该如何设计呢?

4.1一维数组传参

4.2二维数组传参

4.3一级指针传参

思考:当一个函数的参数部分为一级指针的时候,函数能接收什么参数?

比如:

4.4二级指针传参

思考:当一个函数的参数部分为二级指针的时候,函数能接收什么参数?

5.函数指针

首先看一段代码:

输出结果:

输出的是两个地址,这两个地址是test函数的地址。

那我们的函数的地址要想保存起来,怎么保存?

p1可以存放。p1先和*结合,说明p1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void

函数指针的运用:

6.函数指针数组

数组是一个存放相同类型数据的存储空间。

那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针数组如何定义?

p先和[]结合,说明p是数组,数组的内容是int(*)()类型的指针。

函数指针数组的用途:转移表

例子:(计算机)

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

指向函数指针数组的指针是一个指针

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

如何定义?

8.回调函数

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

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

输出结果:(qsort排序,默认升序,若想得到倒序,则将函数return中的p1和p2位置互换)

用qsort来排序结构体

1.按照年龄排序

2.按照名字排序

标签:arr,函数,指向,数组,函数指针,指针,进阶
From: https://blog.csdn.net/2301_78702440/article/details/143768669

相关文章

  • 看过这个,你可能更了解指针一点
    我们先来看下图如果是你,你会认为每一行的输出结果是什么?接下来我们开始分析****在1中****我们知道1中的a被单独使用在数组中,所以此时的a表示一整个数组。而int是其数组储存的类型,一个int占4个字节,所以是4乘4=16。1的答案为16。****在2中****a+0则表示首元素地址,则......
  • c11智能指针
      普通指针的不足new和new[]的内存需要用delete和deletel]释放。程序员的主观失误,忘了或漏了释放。程序员也不确定何时释放。普通指针的释放类内的指针,在析构函数中释放。C++内置数据类型,如何释放?new出来的类,本身如何释放?C++11新增三个智能指针类型uniqu......
  • Python小白学习教程从入门到入坑------第三十二课 生成器(语法进阶)
    目录一、生成器generator1.1生成器表达式1.1.1表达式一1.1.2表达式二二、可迭代对象、迭代器、生成器三者之间的关系2.1定义与特性2.2关系与区别一、生成器generator在Python中,生成器(Generators)是一种用于迭代对象的特殊类型函数。它们允许你生成一个序列......
  • Python小白学习教程从入门到入坑------第三十一课 迭代器(语法进阶)
    目录一、可迭代对象Iterable1.1可迭代对象的条件1.2for循环工作原理1.3isinstance()二、迭代器 Iterator2.1 __iter__() 和 __next__()2.2 可迭代对象&迭代器2.2.1定义与特性2.2.2 关系与转换2.2.3应用场景三、迭代器协议(了解即可)四、自定义迭代器类......
  • Git进阶实用命令
    总结最常用的git命令操作。Mac推荐可视化软件Sourcetree1.本地仓库gitinit#初始化本地git以下所有操作的前提条件gitadd-A#添加当前所有变动文件到本地缓存区gitcommit-m'<commit-word>'#提交缓存区内容到本地仓库gitcommit-am'<commit-word>'#上......
  • 分布式管理进阶:HarmonyOS Next 中的设备信息查询与状态监听
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在探索HarmonyOSNext的分布式管理服务时......
  • Chrome DevTools Protocol 进阶: Page域
    前言本章开始我们将进一步学习ChromeDevToolsProtocol(CDP),首先切入的内容是CDP中的域。在ChromeDevToolsProtocol(CDP)中,Page域是一个至关重要的部分,它负责控制浏览器页面的导航、加载、渲染以及其他与页面相关的操作。通过Page域,你可以执行页面跳转、截图、处理弹......
  • C语言-指针及变量的概念与使用
    1、指针的概念计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如int占用4个字节,char占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。下图是4......
  • ArkUI进阶-1
    文章目录ArkUI(方舟UI框架)1.简介2.基本概念3.概述4.布局1.概述2.通用布局属性1.盒子属性2.背景属性3.定位属性4.通用属性3.线性布局(Row,Column)4.弹性布局(Flex)5.层叠布局(Stack)6.轮播(Swiper)......
  • 第三章:YashanDB 对象管理(进阶篇)
    YashanDB对象管理(进阶篇)表管理表是YashanDB中数据存储基本单元。每个表都是由列和行组成的。创建表时,需要指定表类型。表上可以有约束用于确保数据的有效性表的存储结构存储结构-Segment表——>表段索引——>索引段延迟段的创建USER_TABLESUSER_SEGMENTSR......