鱼C论坛

 找回密码
 立即注册
查看: 37|回复: 4

《带你学C带你飞》S1E24课后题这个打印结果我没看明白@_@

[复制链接]
发表于 昨天 17:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char matrix[3][5] = {
  5.                 'I', 'l', 'o', 'v', 'e',
  6.                 'F', 'i', 's', 'h', 'C',
  7.                 '.', 'c', 'o', 'm', '!'
  8.         };
  9.         char *p;

  10.         p = &matrix[0][3];

  11.         
  12.         printf("%c", *++p);
  13.         printf("\n");

  14.         return 0;
  15. }
复制代码


打印结果为什么是F啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 昨天 17:44 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 17:51 | 显示全部楼层
根据你提供的代码,我来解释为什么打印结果是 `F`。首先,代码中有一个关键错误:数组声明不正确。应该使用 `char matrix[]` 而不是 `char matrix`,否则会编译失败(因为单个字符变量不能用初始化列表赋值)。修正后的代码如下:


  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char matrix[] = {  // 修正:声明为数组
  5.         'I', 'l', 'o', 'v', 'e',
  6.         'F', 'i', 's', 'h', 'C',
  7.         '.', 'c', 'o', 'm', '!'
  8.     };
  9.     char *p = matrix; // p 指向数组首元素 'I'

  10.     printf("%c", *++p); // 关键步骤
  11.     printf("\n");
  12.     return 0;
  13. }
复制代码


打印结果为 `F` 的原因分析:
1. p 初始指向数组首元素 'I'(索引 0)。
2. 执行 *++p 时:
   - ++p 先将 p 自增,指向下一个元素(索引 1,即 'l')。
   - 但注意:这里有一个常见误区!实际代码中的 p = &matrix 是错误的(正确应为 p = matrix)。如果误写为 p = &matrix,那么:
     - &matrix 是“整个数组的地址”,类型为 char (*)[15](指向长度为 15 的数组的指针)。
     - 对这类指针进行 ++p 操作时,指针会跳过整个数组的长度(15 字节),直接指向数组末尾之后的位置。
     - 此时 *++p 访问的是数组外的内存,行为未定义(可能打印随机值,如 `F` 或其他字符)。

结论:
- 若代码误写为 p = &matrix++p 会导致指针越界,打印结果不确定(你看到的 `F` 是偶然结果)。
- 正确写法应为 p = matrix(数组首元素地址),此时 *++p 会正常打印 'l'

验证正确代码的输出:
若修正为 p = matrix,则执行流程如下:
1. p 指向 'I'(索引 0)。
2. ++p 后指向 'l'(索引 1)。
3. printf("%c", *++p) 输出字符 'l'

建议:
- 检查原代码中是否误用了 &matrix
- 始终确保指针类型与操作匹配:操作数组时,直接用数组名 matrix 代表首元素地址。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 18:45 | 显示全部楼层
你为什么不放完整代码
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char matrix[3][5] = {
  5.                 'I', 'l', 'o', 'v', 'e',
  6.                 'F', 'i', 's', 'h', 'C',
  7.                 '.', 'c', 'o', 'm', '!'
  8.         };
  9.         char *p;

  10.         p = &matrix[0][3];

  11.         printf("%c", *p);
  12.         printf("%c", *p++);
  13.         printf("%c", *++p);
  14.         printf("\n");

  15.         return 0;
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 18:46 | 显示全部楼层
本来在v
+1
再+1
就到F
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-2 13:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表