问题遇到的现象和发生背景
可以讲详细一点吗 优先采纳哦
我们来分析一下原因,首先让我们看一下 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
这道题目也可以用排除法来做,首先我们说到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 虽然是个指针,但是可以指向某个内存区域的,这个写法完全正确