C编程数组指针问题:为何运行代码仅输出单词首字母而非完整单词
问题原因分析
你遇到的问题本质是对C语言多级指针、指针数组的解引用规则理解有误,我们先拆解你提供的代码逻辑:
#include <stdio.h> int main() { char *fruit[] = { "watermelon", "banana", "pear", "apple"}; int x; for(x = 0;x<4; x++){ putchar((** fruit) +x ); putchar('\n'); } return 0; }
核心错误点
char *fruit[]是字符指针数组,共存储4个char*类型的指针,分别指向4个字符串常量的首地址。- 表达式
**fruit的取值是固定的:fruit作为数组名退化为指向首元素的指针,第一次解引用*fruit得到第一个元素的值(即字符串"watermelon"的首地址),第二次解引用**fruit得到该地址对应的字符,也就是常量'w'。 - 你当前写的
(** fruit) +x实际是对'w'的ASCII码值做加法,循环输出的结果为w/x/y/z,和数组里其他3个单词完全无关。 - 如果你的实际运行结果是输出了4个单词的首字母
w/b/p/a,说明你实际代码写错为**(fruit + x):这种写法仅能拿到第x个字符串的第一个字符,自然只会输出首字母。
正确实现
输出所有单词的首字母
for(x = 0;x<4; x++){ // 等价于 putchar(**(fruit +x)) putchar(*(fruit[x])); putchar('\n'); }
输出完整单词
直接传入第x个字符串的首地址给字符串输出函数即可,%s格式符/puts会自动从首地址开始输出直到遇到字符串结束符\0:
for(x = 0;x<4; x++){ // 等价于 printf("%s\n", fruit[x]) puts(fruit[x]); }
内容的提问来源于stack exchange,提问作者bini_01
相关产品推荐
相关产品推荐

