首页 > 试题广场 >

设有定义char *p[]={"Shanghai","Bei

[单选题]
设有定义char *p[]={"Shanghai","Beijing","Honkong"};则结果为j字符的表达式是()
  • *p[1] +3
  • *(p[1] +3)
  • *(p[3] +1)
  • p[3] [1]
char型指针数组,可以看理解成形如char p[][]的二维数组。题中j所在位置即p[1][3],这时有多种办法表示p[1][3],*(p[1] +3)或是*(*(p+1)+3)
发表于 2016-04-11 14:20:11 回复(1)
char *p[]={"Shanghai","Beijing","Honkong"};
cout << p[1] << endl; //Beijing 
cout << "Beijing" + 3 << endl; //jing 
cout << *(p[1] + 3) << endl; //j 
cout << *p[1] << endl; //B 
cout << *p[1] + 3 << endl; //69 
cout << 'B' + 3 << endl; //69
编辑于 2017-12-11 11:48:45 回复(0)

B:先通过p[1]获取指针数组中第2个元素的值,即"Beijing"的地址。然后在这个地址上偏移3个字节,即指向字符串中的第4个字符,即'j'字符。
A: *p[1] +3 表示对指针数组p中的第2个元素进行解引用操作,即获取字符串常量"Beijing"。然后将字符串的首字母'B'的ASCII码值与3相加。
C: *(p[3] +1) 表示对指针数组p中的第4个元素进行解引用操作,但是p数组中只有3个元素,所以超出了数组的有效索引范围。这是非法的表达式。
D: p[3][1] 表示对指针数组p中的第4个元素进行解引用操作,但是p数组中只有3个元素,所以超出了数组的有效索引范围。这是非法的表达式。
题中j所在位置即p[1][3],这时有多种办法表示p[1][3],*(p[1] +3)或是*(*(p+1)+3)
发表于 2023-08-18 16:10:14 回复(0)
记住p[i]等价于*(p+i)就行
发表于 2022-01-06 16:45:57 回复(0)
关键是理解char*数组本质上就是char的二维数组,那就简单了。
所以p[1]是行指针,*p[1]+3是'B'的ascii码+3,显然不合题意。
*(p[1]+3)是"Beijing"这个字符串的首地址 + 3然后再取值,正好取出j
发表于 2021-12-06 19:42:33 回复(0)
解引用 * 的优先级比 + 高,所以选项A输出为 字符‘B’的ANSI码 66 + 3 = 69;
选项C、D均越界。
发表于 2017-03-03 14:47:46 回复(0)
了然
发表于 2019-04-10 11:11:42 回复(0)

A.*p[1] + 3

  • p[1]是指向 "Beijing" 的指针,*p[1]得到 "Beijing" 的第一个字符 'B','B' + 3得到字符 'E'(在 ASCII 表中 'B' 后的第三个字符),所以不是 'j'。

B.*(p[1] + 3)

  • p[1]是指向 "Beijing" 的指针,p[1] + 3移动到 "Beijing" 中的第四个字符,即 'j',然后解引用得到 'j'。这是正确的。

C.*(p[3] + 1)

  • 数组p只有三个元素(p[0]、p[1]和p[2]),p[3]超出了数组的范围,因此这是一个未定义的行为。

D.p[3][1]

  • 和选项 C 一样,这同样超出了数组的范围。
编辑于 2023-12-14 09:53:28 回复(0)
发表于 2023-07-10 00:14:49 回复(0)
char型指针数组,p1是第二个字符串的地址,对于字符串,它的地址同时也是它首字符的地址。https://blog.csdn.net/sgbl888/article/details/124475307
发表于 2023-02-17 13:10:39 回复(0)
先取到P1数组第二个值,再去取里面具体字符
发表于 2019-10-09 11:31:58 回复(0)
A选项下边运算符优先级更高
发表于 2016-08-10 21:32:36 回复(0)