2025年ifstream in用法(ifstream::in)

ifstream in用法(ifstream::in)本节重点 字符指针 数组指针 指针数组 数组传参和指针传参 函数指针 难 函数指针数组 难 指向函数指针数组的指针 回调函数 难 前言 在 C 语言基础阶段 我们学习过指针相关的一些基础内容 比如说 指针是一个变量 用来存放地址 地址是唯一标识一块内存空间 指针的大小是固定的 4 8 个字节 32 位平台 64 位平台 指针是由类型 指针的类型决定了指针的 整数的步长 指针解引用操作时候的权限 指针的运算 在指针的类型中我们知道有一种指针类型为字符指针 char 一般使用



本节重点

  1. 字符指针
  2. 数组指针
  3. 指针数组
  4. 数组传参和指针传参
  5. 函数指针(难)
  6. 函数指针数组(难)
  7. 指向函数指针数组的指针
  8. 回调函数(难)

前言

在C语言基础阶段,我们学习过指针相关的一些基础内容,比如说:

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

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

一般使用:

 
  

 
  

扩展:在C语言中,内存可以被划分为栈区、堆区、静态区、常量区。

w300

  • 栈区:局部变量,函数形参,函数调用
  • 堆区:动态内存如malloc等申请使用
  • 静态区:全局变量,static修饰的局部变量
  • 常量区:常量字符串(常量区中的内容在整个程序的执行期间是不允许被修改的,且同一份常量字符串只会创建一份,不会重复创建存储。)

有这样的面试题:

 
  

打印出的结果:

 
  

(自我理解)

  • str1与str2相当于先选两个位置(地址),再搭房子(存hello world),因此两房子不同(只是长得一样,不是同一个房子)
  • 而str3与str4则相当于先造一个房子(存hello world),然后用两张纸写的同一个地址
 
  
 
  

int* arr1[10]; //整型指针的数组

char* ch[5]; //字符指针的数组

char* arr2[4]; // 一级字符指针的数组

char arr3[5]; //二级字符指针的数组(存放二级指针)

 
  

首先,我们要知道[]的优先级是比 * 要高的,对于形式1,pa会先与[ ]结合,再与 * 结合,所以形式1是指针数组

()的优先级又比[]高,所以pa会先于 * 结合,在与[ ]结合,所以形式2是数组指针。

 
  

w300

<br>可以看出,arr+1 相较于 arr 跳过了4个字节的大小, <br>而 &arr+1 相较于 &arr 跳过了40(10*4)个字节,一个数组的地址 <br>因为&arr 指向的是一整个数组

大多数情况下数组名是数组首素的地址,但是有两个例外:

  1. sizeof(数组名)
  2. &数组名

3.3.1 对一维数组的使用

例: 1

 
  

例: 2

 
  

可以看出对一维数组使用例1的方法更方便简捷,例2的方法有点鸡肋

3.3.2 对二维数组的使用

 
  

3.3.3 巩固练习

下面这些代码的含义是什么?

 
  

解析:

 
  
 
  

答案:以上传参方式相对应的均ok

注意:一维数组传参可以传数组形式,也可以传指针形式,传数组形式的时候数组素的个数可以不写,也可以写,传指针的时候要注意指针的类型,也就是指针指向什么类型的素,

比如说指针指向int类型素,那么指针的类型就是 int*

 
  

总结 : 二维数组传参,函数形参的设计只能省略第一个[ ]的数字
因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少素。
这样才方便运算。
二维数组传参也能写成指针的形式,指针的类型应该是数组指针。 传什么,就用什么接收







 
  
 
  

注:数组类型参数 arr 1发生退化,变成了指向数组第一个素的指针。这意味着在函数内部,arr 1被当作一个指针来处理,而不是一个完整的数组。

 
  
 
  

分下下面两段代码

代码1:

(void (*)())0 —— 把0强制转化为一个函数的地址

(*(void ( * )())0)();——解引用0地址的函数,并调用

代码2:

剩下void( * )( int )——说明signal的返回类型也是一个函数指针类型

上述代码是一次函数声明 // 声明的函数叫:signal // signal函数的第一个参数是int类型的 // signal函数的第二个参数是一个函数指针类型,该函数指针指向的函数参数是int,返回类型是void // signal函数的返回类型也是一个函数指针类型,该函数指针指向的函数参数是int,返回类型是void

// void (*)(int) signal(int, void( * )(int)); //err

上述简化是错的,可以用 typedef 函数进行简化

typedef void (*pf_t)(int) ;//pf_t为 void ( * )(int) 函数指针类型

pf_t signal( int, pf_t);

数组是一个存放相同类型数据的存储空间,我们已经学习了指针数组与函数指针,比如︰

  • parr1先和[结合,说明parr1是数组。
  • 数组的内容是什么呢 ?
  • 是int(*)()类型的函数指针。
 
  

改进

 
  

这种函数指针数组 我们经常称为 转移表

 
  

暂时能认识就行

 
  

每个case中语句执行重复度太高
改进

 
  

当calc函数传送的是Add函数的地址,这是p调用的是Add函数,这是我们称Add为回调函数

这里并不是直接调用各种计算函数,而是把计算函数函数的地址,传递给了calc函数
再由calc函数指针 int ( * p)(int, int) 之后,在适当位置通过函数指针 p 调用它所指向的函数

这个机制就称为回调函数

8.2.1 回顾冒泡排序

 
  

8.2.2 qsort介绍

 
  

void* 类型讲解: void是无,空的含义,void * 表示的是无类型的指针。 void* 指针可以接收任意类型的地址(void 可以看作指针万能筒,可以接收任意类型) void 类型指针不能进行解引用操作的。

理解:我们知道指针类型的意义除了决定指针解引用时访问字节的个数外,还决定了指针 + -整数运算的步长,如果指针类型是void * 无类型指针,那么就无法得知该指针 + -的步长到底是多少个字节。

8.2.3 qsort在升序降序中的使用

 
  

8.2.3 qsort在结构体排序中的使用

 
  

改造冒泡排序,使得其能排序任意指定数组

 
  

请写出下面程序执行的结果

 
  
 
  

请写出下面程序执行的结果

 
  

详解及结果展示:

 
  
 
  

详解及结果展示:

 
  

请写出下面程序执行的结果

 
  
 
  

请写出下面程序执行的结果

 
  

详解及结果展示:

 
  

请写出下面程序执行的结果

 
  

详解及结果展示:

 
  

请写出下面程序执行的结果

 
  

详解及结果展示:

 
  

请写出下面程序执行的结果

 
  

知识储备: 二维数组的数组名表示首素地址时,首素指的是第一行数组,也就是说首素是数组,数组名表示的是第一行数组的地址

详解及结果展示:

 
  
 
  

2,5

 
  
 
  

 
  
 
  
 
  
 
  

 
  

详解及结果展示:

 
  
 
  

 
  
 
  

今天的文章 
  2025年ifstream in用法(ifstream::in)分享到此就结束了,感谢您的阅读。 
  

                    
编程小号
上一篇 2025-06-08 07:11
下一篇 2025-12-08 20:01

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/28279.html