C复习-函数指针+字符串常量

news/2025/3/12 9:57:29/

参考: 里科《C和指针》


指针热身

int *f(); // ()优先级高于*,所以f是一个函数,返回int指针
int (*f)(); // f是一个函数指针,它指向的函数返回一个int值
int *(*f)(); // f是一个函数指针,它指向的函数返回一个int指针
int *f[]; // []的优先级更高,所以是一个数组,但元素是int指针
int (*f[])(); // f是一个数组,其元素类型是函数指针,它指向的函数返回值是int
int *(*f[])(); // 同上,只是返回的是int指针

函数指针

用途:把函数指针作为参数传递给函数;转换表

// 声明
int f(int);
// &非必需,因为编译器会把函数名转化为函数指针,&只是显式说明
int (*pf)(int) = &f; 
// 使用
int ans;
ans = f(25);
ans = pf(25);
ans = (*pf)(25); // *只是显式说明
  1. 回调函数
// compare()在search_list()中用来比较值。这个函数可以处理多种类型的数据
// 声明
Node*
search_list(Node *node, void const *value,int (*compare)(void const *, void const *) );
// 使用
desired_node = search_list(root, &desired_value, compare);
  1. 转换表

比如设计一个计算器,如果有非常多的操作,整个switch会非常大,此时可以使用转换表:先声明并初始化一个函数指针数组,然后用一个语句替代switch。注意:需要始终验证下标的有效性。

// 原本的swithc
switch(oper) {case ADD:result = add(op1, op2);break;case SUB:result = sub(op1, op2);break;...
}//------使用转换表------------// 先写函数声明
double add(double, double);
double sub(double, double);
...
// 再初始化转换表
double (*oper_func[])(double, double) = {add, sub,...};
// 替换switch
result = oper_func[oper](op1, op2);

命令行参数

// argc是参数个数,argv是一个指针数组,其中的元素是指向字符串的指针
int
main( int argc, char **argv);

字符串常量

字符串常量实际是指针,下面是一些应用。

"xyz" + 1 // 是指向y的指针
*"xyz" // x
"xyz"[2] // z// 输入0~100,打印0~10个星号
void
mystery (int n)
{n += 5;n /= 10;print("%s\n", "**********" + 10 - n);
}// 打印余数。如果是十六进制的0~15,那直接[]转化成十六进制字符
putchar("0123456789ABCDEF"[value % 16]);

http://www.ppmy.cn/news/1210155.html

相关文章

ubuntu上如何移植thttpd

thttpd的特点 thttpd 是一个简单、小巧、便携、快速且安全的 HTTP 服务器。 简单: 它只处理实现 HTTP/1.1 所需的最低限度。好吧,也许比最低限度多一点。 小: 请参阅比较图表。它还具有非常小的运行时大小,因为它不会分叉并且非…

ES6 部分新特性使用

箭头函数 // 箭头函数定义 const add (a, b) > a b; console.log(add(1, 2)); // 输出3// 箭头函数表达式 const nums [1, 2, 3]; const sum nums.reduce((total, num) > total num, 0); console.log(sum); // 输出6 模板字符串 // 使用模板字符串拼接字符串 con…

uniapp移动端实现上拉加载(分页),下拉刷新

上拉加载 在需要实现该功能的页面写入 onReachBottom&#xff08;&#xff09;方法函数&#xff0c;该方法与 onLoad() 方法同级&#xff0c;需在在data中声明 pageNo和pageSize以及总条数&#xff0c;具体代码如下&#xff1a; html 部分 <-- html部分 引入uview 使用u…

linuxC语言缓冲区及小程序的实现

文章目录 1.文件缓冲区1.1介绍1.2缓冲文件系统1.3冲刷函数fflush1.4认识linux下的缓冲区 2.linux小程序的实现2.1 回车\r和换行\n2.2倒计时程序2.3进度条小程序sleep/usleep代码运行结果 1.文件缓冲区 1.1介绍 为缓和 CPU 与 I/O 设备之间速度不匹配&#xff0c;文件缓冲区用以…

内网如何使用Python第三方库包(举例JustinScorecardPy)

内网如何使用Python第三方库包 一、下载python whl文件(官网有的) 1、第一种方法 要直接下载whl文件&#xff0c;你可以按照以下步骤操作&#xff1a; 首先&#xff0c;访问 https://pypi.org/ 或 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 网站。这两个都是Python的官方…

93. 递归实现组合型枚举

题目 思路 一个m个坑位&#xff0c;填n个数&#xff0c;就依次往里放就好了 同时判断一下升序&#xff0c;当前这个数比前一个数大就可以了 代码 #include <bits/stdc.h> using namespace std; int n, m; int ans[30]; int f[30]{0}; void dfs(int v) {if (v > m) …

Azure 机器学习 - 如何使用模板创建安全工作区

目录 先决条件了解模板配置模板连接到工作区疑难解答错误&#xff1a;Windows 计算机名的长度不能超过 15 个字符&#xff0c;并且不能全为数字或包含以下字符 本教程介绍如何使用 [Microsoft Bicep]和 [Hashicorp Terraform]模板创建以下 Azure 资源&#xff1a; Azure 虚拟网…