首页 > 试题广场 >

若有定义: char s[3][4]; 则下列对

[单选题]
若有定义:
char s[3][4];
则下列对数组元素s[i][j]的各种引用形式中,正确的是()
  • * (s+i)[j]
  • * (&s[0][0]+4 * i+j)
  • * ((s+i)+j)
  • * ( * (s+i)[j])
A 、 *(a+i)[j],错误的原因是(a+i)结束后下一步运算是(a+i)[j],而不是*(a+i),正确写法是(*(a+i))[j].。B、正确。
C、正确写法:*(*(s+i)+j)。
D、正确写法和A一样。
发表于 2018-06-14 10:09:12 回复(2)
这道题选B
&s[0][0]得到的是首元素的地址,
&s[0][0]+4 * i得到的是i行首元素的地址
&s[0][0]+4 * i+j得到的是s[i][j]的地址&s[i][j] 
* (&s[0][0]+4 * i+j)得到的就是s[i][j]的值。
这道题的另外一种写法就是*(*(s+i)+j)



发表于 2018-06-13 11:26:58 回复(8)
A中[]优先级比*高
发表于 2018-07-23 13:27:55 回复(0)
A 、 *(a+i)[j],错误的原因是(a+i)结束后下一步运算是(a+i)[j],而不是*(a+i),正确写法是(*(a+i))[j].。B、正确。 C、正确写法:*(*(s+i)+j)。 D、正确写法和A一样。
发表于 2018-09-05 15:28:09 回复(2)
假设i,j都为0
A选项:*s[0]
B选项:*(&s[0][0]) -> s[0][0]
C选项:*s
D选项:*(*s[0])
发表于 2022-01-20 15:32:33 回复(0)
B有点上头,先是拿到了数组第一个元素的地址,在4*i且他的一行是4个元素,那么就可以直接访问行了和(a+i)一样,且这里二维数组和一维一样在内存中是连续存放的,后面在+j --> *(a+i)+j,希望对你有所帮助
发表于 2021-10-13 09:30:57 回复(0)
特例法,令i=0,j=0,再判断,比较容易
发表于 2019-11-12 16:37:25 回复(0)
特例法,加上优先级比较
发表于 2023-09-16 15:43:17 回复(0)
[]比*的优先级高
发表于 2023-09-13 21:29:13 回复(0)
A和C 选项都是在对数值取*,  然而 
(s+i)[j]
((s+i)+j)
s[i][j]  
三者是等价的, 我们对数值 取 * 是没有意义的. 如此的D选项  对数值取 ** 更荒谬了.
B选项:  &[0][0] 拿到数组的第一个元素的地址,  '&[0][0]' 的类型为 char* 型,  令 char *p = &[0][0]; 
则原式化为  *(p + 4*i + j), 此时把数组看成连续的一维数组, 括号里找到元素地址, 再取* 即可取出元素的值. 


发表于 2022-11-26 00:56:14 回复(0)
char (*s)[4]
发表于 2021-09-09 10:15:48 回复(0)
*:解引降维。
发表于 2021-05-26 15:35:53 回复(0)