“聪明”地简化

脑海翻滚,有意

恰好看到一文

1)请说出指针数组和数组指针的区别; 2)请说出函数指针和指针函数的区别。
笔者最近仔细研究了下这两类问题,对比英文定义,
发现根源还是我们的汉语博大精深(或者说语法不严谨),从而导致一堆绕口令式的“专业术语”
,绕来绕去将人绕晕。

1)指针数组和数组指针
指针数组(Array of Pointers):
int *array[10];
如英文定义,是由Pointer组成的Array,本质是一个Array,
Array中的每一个元素都是一个Pointer,如上面的例子,array[i]是一个指向int类型的指针。

数组指针(Pointer to Array):
int (*array)[10];
如英文定义,是一个指向Array的Pointer,如上定义,
因为[]的优先级最高,需要对*array加括号,
这个指针指向一个一维数组,array++,指针会向后偏移一维数组(int array[10])
所占的空间。
使用Pointer to Array,可以很方便实现二维数组。

2)指针函数和函数指针

函数指针(Pointer to Function):
函数指针在Linux中非常普遍,回调函数或处理函数都会使用 函数指针来定义,
这样代码只需定义一个框架,程序实现时根据不同的需求传入不同的函数指针,
可以实现类似高级语言多态的功能。

比如大名鼎鼎的signal函数,定义如下:

 typedef void (*sighandler_t)(int);
 sighandler_t signal(int signum, sighandler_t handler);
在Linux的设备驱动中,open、read、write操作也是函数指针,
static const struct file_operations fifo_operations = {
  .owner = THIS_MODULE,
  .open = dev_fifo_open,
  .read = dev_fifo_read,  
  .write = dev_fifo_write,
 };

指针函数(Function returnning Ponter):
看过英文定义,就能明白这是某些从业者主观臆造的的定义,也是很操蛋的定义。
C语言本身没有指针函数的概念,这个是指返回值是指针的函数,
比如大名鼎鼎的 void *malloc(size_t size);

如果说上面三个概念还有作用,定义指针函数除了混淆视听之外,是毫无作用。
既然将返回值是指针的函数定义为指针函数,那为什么不再定义整形函数、字符函数、
void函数、结构体函数,从而覆盖所有类型范围值的函数呢?

————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.youkuaiyun.com/Illina/article/details/95208028

我的本意

对于外文,意传递给学生过程:1原意-2原文-3读意-4转换-5译文-6老师理解-7师说-8学生理解

教学:

  • 老师读的是译文,不清楚不理解,完蛋。1到5没有,6到8混乱
  • 老师读了原文,理解,但也按照译文教学,自己是非常理解和明白原意,也认为这样讲学生也能理解原意。也就是5和7一致,没有6
  • 学生直接读原文,理解原意,没有中间人,没有多人转义,人为咀嚼。不知道当时玄奘到西域是否也有同样感受

现状:

  • 榆木脑袋,这么明晰简单,不理解?
  • 教科书编的真烂,不讲人话。外文教科书编的多好,多么好理解
  • 我翻译的多好,简单明了,朗朗上口。省去介词、动词修饰语,直接将名词活用为动词,或者说直接名词堆砌,不仅互文,还包含有一种结构美、建筑美。“枯藤老树昏鸦,小桥流水人家”,词美,字美,译美。加把劲,数组指针/指针数组,函数指针/指针函数,指针常量/常量指针,常量/变量/常变量,…,多么言简意赅呀!

勒夏特列:

  • 译文和咀嚼并不一定是有害的,本土化,生活化,贴身场景化,更多实例和示例都可以帮助,快速,正确地理解新概念的含义。不能一棒子打死,关键在比例。
  • 也可能是幸存者偏差。外文差的书没人看,传不远,流传不久,于是你看不到。好的书传得远,流传久,于是外文书你看到的都是“好”书。所谓“外国的月亮圆”大概是这样吧,虽然“月是故乡明”。
  • 还有可能是“距离产生美”,距离也是上面能“偏差”的成因。没有了解,近距离,细致全面地接触,总是带有一种想象的朦胧美。没有得到的或者得不到的总是朝着美化的方向预估,结果也可能是叶公好龙,自己真正喜好的是想象中的那个,距离滋生想象。

结合一下

  • 2原文:Array of Pointers
  • 3读意:
    • 由Pointer组成的Array。
    • 每一个元素都是一个Pointer的Array
    • 是Array,每一个元素都是一个Pointer
  • 4转换:
    • 由指针组成的数组。
    • 每一个元素都是一个指针的数组
    • 是数组,每一个元素都是一个指针
  • 5译文:
    • 由指针组成的数组;每一个元素都是一个指针的数组;是数组,每一个元素都是一个指针
    • 指针数组(“聪明”地简化)
  • 6老师理解:指针是定语,起修饰作用,数组是被修饰的名词。指针的数组
  • 7师说:(和5译文没有区别)
    • 由指针组成的数组;每一个元素都是一个指针的数组;是数组,每一个元素都是一个指针
    • 指针数组(“省事”地沿用)
  • 8学生理解:
    • 指针数组。记住这个名词了,很关键的点,老师多次重复这个词,一定是记忆点,重点
    • 进一步,含义呢?
      • 指针,指向,“指向”是什么意思?
      • 数组,一排方格子。
      • 指针数组,有指针,还有数组,还有个数组指针,好像呀
    • 是数组,每一个元素都是一个指针。是指针,指向一个数组(大声)
    • 是数组,每一个元素都是一个指针。是指针,指向一个数组(重复)
    • 是数组,每一个元素都是一个指针。是指针,指向一个数组(三)
    • 是指针,指向一个数组。是数组,每一个元素都是一个指针(乱)
    • 是指针,指向一个数组。是数组,每一个元素都是一个指针
    • 是指针,指向一个数组。是数组,每一个元素都是一个指针
    • 几天后,再来一遍(反复几遍,烦,开始怪罪,本着不应该怀疑自己的原则,顺溜转入现状第二条)
(SCI三维路径规划对比)25年最新五种智能算法优化解决无人机路径巡检三维路径规划对比(灰雁算法真菌算法吕佩尔狐阳光生长研究(Matlab代码实现)内容概要:本文档主要介绍了一项关于无人机三维路径巡检规划的研究,通过对比2025年最新的五种智能优化算法(包括灰雁算法、真菌算法、吕佩尔狐算法、阳光生长算法等),在复杂三维环境中优化无人机巡检路径的技术方案。所有算法均通过Matlab代码实现,并重点围绕路径安全性、效率、能耗和避障能力进行性能对比分析,旨在为无人机在实际巡检任务中的路径规划提供科学依据和技术支持。文档还展示了多个相关科研方向的案例与代码资源,涵盖路径规划、智能优化、无人机控制等多个领域。; 适合人群:具备一定Matlab编程基础,从事无人机路径规划、智能优化算法研究或自动化、控制工程方向的研究生、科研人员及工程技术人员。; 使用场景及目标:① 对比分析新型智能算法在三维复杂环境下无人机路径规划的表现差异;② 为科研项目提供可复现的算法代码与实验基准;③ 支持无人机巡检、灾害监测、电力线路巡查等实际应用场景的路径优化需求; 阅读建议:建议结合文档提供的Matlab代码进行仿真实验,重点关注不同算法在收敛速度、路径长度和避障性能方面的表现差异,同时参考文中列举的其他研究案例拓展思路,提升科研创新能力。
### 聪明格(KenKen)与 C 语言相关的实现和应用 聪明格(KenKen)是一种结合了数独规则与算术运算的逻辑游戏,通常用于锻炼逻辑思维能力。在编程领域,它也常被用作算法设计与实现的练习题目,尤其是在 C 语言中,可以通过回溯法(Backtracking)实现自动求解。 #### C 语言在聪明格求解中的应用 C 语言作为一门系统级编程语言,具有高效的执行性能和底层控制能力,适合用于实现聪明格求解器。通过回溯算法可以遍历所有可能的数字组合,验证每一种组合是否满足聪明格的规则:每一行和每一列的数字不重复,且每个“笼子”(cage)中的数字经过指定的算术运算后得到目标值。 以下是一个使用 C 语言实现聪明格求解器的简化版本示例: ```c #include <stdio.h> #include <stdbool.h> #define SIZE 3 // 3x3 的聪明格 // 检查当前数字是否在行或列中重复 bool is_valid(int grid[SIZE][SIZE], int row, int col, int num) { for (int i = 0; i < SIZE; i++) { if (grid[row][i] == num || grid[i][col] == num) { return false; } } return true; } // 检查是否满足笼子的算术条件 bool check_cage(int grid[SIZE][SIZE], int cages[SIZE][SIZE], int target, char op, int row, int col) { // 此处简化处理,实际应遍历每个 cage 并计算其内数字的运算结果 return true; } // 回溯法求解聪明格 bool solve_kenken(int grid[SIZE][SIZE], int cages[SIZE][SIZE], int target, char op, int row, int col) { if (row == SIZE) { return true; // 解出成功 } for (int num = 1; num <= SIZE; num++) { if (is_valid(grid, row, col, num)) { grid[row][col] = num; if (check_cage(grid, cages, target, op, row, col)) { int next_row = row; int next_col = col + 1; if (next_col == SIZE) { next_row++; next_col = 0; } if (solve_kenken(grid, cages, target, op, next_row, next_col)) { return true; } } grid[row][col] = 0; // 回溯 } } return false; } // 打印解出的聪明格 void print_grid(int grid[SIZE][SIZE]) { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { printf("%d ", grid[i][j]); } printf("\n"); } } int main() { int grid[SIZE][SIZE] = {0}; // 初始化为空格 int cages[SIZE][SIZE] = {0}; // 简化表示,实际应使用结构体表示笼子 char operation = '+'; // 示例为加法 int target = 5; // 示例目标值 if (solve_kenken(grid, cages, target, operation, 0, 0)) { print_grid(grid); } else { printf("无解\n"); } return 0; } ``` #### 算法设计与逻辑验证 在聪明格求解过程中,C 语言的指针和数组操作能力可以高效地处理二维网格。通过函数指针(Pointer to Function)[^3],可以将不同的算术操作(加、减、乘、除)封装为独立函数,提升代码的可扩展性和可读性。例如: ```c typedef bool (*OperationFunc)(int*, int, int); bool add_op(int* values, int count, int target) { int sum = 0; for (int i = 0; i < count; i++) { sum += values[i]; } return sum == target; } bool sub_op(int* values, int count, int target) { int diff = values[0]; for (int i = 1; i < count; i++) { diff -= values[i]; } return diff == target; } ``` #### 编译与调试注意事项 在编写聪明格求解程序时,需要注意 C 语言的一些常见陷阱,例如类型不匹配、数组越界、未初始化变量等。如果使用 `lint` 工具[^2],可以提前发现这些问题,提升代码质量。此外,Kernighan 和 Ritchie 所著的《The C Programming Language》[^1]是学习 C 语言编程的最佳参考资料,尤其适合理解底层逻辑和数据结构的实现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值