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

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

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

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

img

img

  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 虽然是个指针,但是可以指向某个内存区域的,这个写法完全正确