C语言中为何要将const char指针赋值给另一个指针变量?
问题背景
在compute_scrabble_value函数的实现中,存在两种运行结果完全一致的写法:
- 第一种写法将入参
const char *word赋值给独立的局部指针变量const char *p,通过遍历指针p完成拼字游戏分值计算,完整代码如下:
#include <stdio.h> #include <ctype.h> #define MAX_LEN 30 int compute_scrabble_value(const char *word); const int scrabble_values[26] = {1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10 }; int main(void) { const char word[MAX_LEN + 1]; printf("Enter a word: "); scanf("%s", word); printf("Scrabble value: %d", compute_scrabble_value(word)); return 0; } int compute_scrabble_value(const char *word) { const char *p = word; int total = 0; while (*p) { total += scrabble_values[toupper(*p++) - 'A']; } return total; }
- 第二种写法不做额外指针赋值,直接操作入参
word指针完成遍历,代码如下:
int compute_scrabble_value(const char *word) { int total = 0; while (*word) { total += scrabble_values[toupper(*word++) - 'A']; } return total; }
核心疑问:将const char类型指针额外赋值给另一个独立指针变量的设计目的是什么?
设计目的说明
这种写法没有强制的功能性要求,两种写法在开启编译器优化后生成的机器码完全一致,不会有性能差异,属于C语言长期发展中形成的编码习惯,核心作用有两个:
- 保留入参原始值,降低代码的理解成本
很多传统C编码规范默认把函数入参当作只读值,不建议在函数执行过程中直接修改。如果直接对入参word做自增遍历,读代码的人需要反复确认“原始传入的字符串地址后面会不会用到”;单独定义一个遍历用的指针p,表意非常明确:word始终保存传入字符串的起始地址,p只是专门用来走遍历流程的临时变量,逻辑一目了然。
如果后续函数逻辑扩展,需要用到字符串的起始位置做其他操作——比如计算长度、打印原始输入、做前缀匹配——直接用word就行,不用特意把偏移过的指针重置回起点,能减少很多指针偏移错误、野指针类的低级bug。 - 适配早期调试工具的使用习惯
早年的C调试器功能非常简陋,如果遍历过程中直接修改了入参指针,想回头查看完整的原始输入字符串,得手动算当前指针和起始位置的偏移量往回找,非常麻烦。保留存原始地址的word变量、单独用p做遍历,调试时直接查看word指向的内存就能拿到完整原始输入,排查问题省很多事。
现在这种写法更多是风格选择,不存在哪种写法绝对正确的说法,只要团队编码规范统一即可。
内容的提问来源于stack exchange,提问作者Fary
相关产品推荐
相关产品推荐

