qq_46067327 2022-11-07 17:05 采纳率: 94.1%
浏览 50
已结题

C语言数组相关知识 不需要只给答案的

问题遇到的现象和发生背景

可以讲详细一点吗 优先采纳哦

用代码块功能插入代码,请勿粘贴截图

img

img

  • 写回答

1条回答 默认 最新

  • 莪是男神 2022-11-07 22:49
    关注
    1. 第一题答案是D

    img

      我们来分析一下原因,首先让我们看一下 int (*prt)[3] = a, *p = a[0]; 这条语句:prt 是一个指针数组,而 p 是个指针
      但是这里对于 p 指针的赋值是完全错误。因为 a[0] 的值不是地址,将一个不是地址的值赋值给指针不会报错,但是会得不到正确的值,可以排除 B 选项。不过如果将 p的赋值 改为 *p = &a[0][0],再将 B 选项改为 *(p+5) 就可以得到正确的值
      然后我们再来分析一下另外三个选项,首先说说 A 选项 *((*prt+1)[2]),写法上就有问题,不能混用 “*”“[]”,这个表达式都不能通过编译,更别说得出正确的值,把 A 选项改为 *(prt[1] + 2)*(*(prt+1) + 2) 都可以得到正确的值。再来说说 C 选项 (*prt+1) + 2 ,可以通过编译,也能输出值,但是他这个得到的值是地址,不是数据,所以 C 选项错误,不过如果改为 *(*(prt+1) + 2) 是可以得到正确的值的,最后再来说说 D 选项 *(*(a+1) +2) ,首先写法上是对的,数组的名字可以当成指针来使用,这个写法就等同于 a[1][2]*(*a+5),*(a+1) 拿到了 a[1] 的地址,然后再 +2 往前递增两个位置,所以得到了正确的值。

    2.第二题的答案也是D

    img

      这道题目也可以用排除法来做,首先我们说到A选项 char s[5] = {"ABCDE"}; puts(s),写法上没错,就是忽略了C语言字符串的特殊性,字符串的实际长度永远要多一个'\0'结束符号的为主,这里的问题是少了一个空间,接着我们在说说 B 选项char s[5] = {'A','B','C','D','E'};puts(s);,其问题和A选项的问题一样的,这里不再赘述,再来说说 C 选项char *s;scanf("%s",s);puts(s);,它的问题在于 s 是个字符串指针里面不能直接放字符串的,最后说说 D 选项char * s; s="ABCDE";puts(s);,s 虽然是个指针,但是可以指向某个内存区域的,这个写法完全正确

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月16日
  • 已采纳回答 11月8日
  • 创建了问题 11月7日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥15 有关于推荐系统jupyter
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌