C++ 程序的输出 |第 39 组(指针)
先决条件: C/C++ 中的指针
问题 1 以下 C++ 程序会打印什么?
#include
#include
using namespace std;
int main()
{
float x = 5.999;
float* y, *z;
y = &x;
z = y;
cout << x << ", " << *(&x) << ", " << *y << ", " << *z << "\n";
return 0;
}
a) 5.999、5.999、5.999、5.999
b) 5.999、5.9、5.000、5.900
c) 元素的地址
d) 编译错误
Answer: a
解释:这样做的原因是 x 给出了存储在变量 x 中的值。 *(&x) 给出地址&x 中存储的数据值,即x 的数据值。由于 y 指向 x (..y=&x),*y 给出 x 的值。并且因为 z 与 y 的地址相同,*z 也给出了 x 的值,即 5.999
QUE.2 以下 C++ 程序会打印什么?
#include
using namespace std;
int main()
{
int track[] = { 10, 20, 30, 40 }, *striker;
striker = track;
track[1] += 30;
cout << "Striker>" << *striker << " ";
*striker -= 10;
striker++;
cout << "Next@" << *striker << " ";
striker += 2;
cout << "Last@" << *striker << " ";
cout << "Reset To" << track[0] << " ";
return 0;
}
a) 10、20、30、40
b) Striker>10 Next@50 Last@40 Reset To0
c) Striker>10 Next@40 Last@50 Reset To0
d) Striker> Next@ Last@ 重置为
Answer: b
说明:数组轨道包含 4 个元素 {10, 20, 30, 40} 并且指针罢工者持有数组轨道的基地址,即轨道 [0] 的地址。
1) *striker 持有 track[0] 的数据值,即 10。在 *striker 中减少 10 使得 track[0]=0。
2) 递增指针striker 给出track 的下一个位置,即1。现在*striker 给出track[1] 的数据值。
3) 再次增加 2,striker 到达数组 track 的地址 4,即 track[4]。
4)最后打印track[0]处的值为0(见步骤1)
问题 3 以下 C++ 程序会打印什么?
#include
using namespace std;
int main()
{
int a = 32, *ptr = &a;
char ch = 'A', &cho = ch;
cho += a;
*ptr += ch;
cout << a << ", " << ch << endl;
return 0;
}
选项
a) 97, A
b) 128, A
c) 97, 一个
d) 129, 一个
Answer: d
说明: ptr 是一个指针,它保存 a 的地址,而 *ptr 返回 a 的数据值。 Cho 是一个引用变量,它保存 ch 的引用。现在,将 cho 的值增加 32(ASCII 值),反映到 cho 和 ch 使其等于“a”(字母)。在最后一步,*ptr 的数据值按 ch 递增,即“a”给出 a = 129。
QUE.4 以下 C++ 程序的输出是什么?
#include
using namespace std;
int main()
{
const int i = 20;
const int* const ptr = &i;
(*ptr)++;
int j = 15;
ptr = &j;
return 0;
}
a) 元素的地址
b) 运行时错误
c) 编译错误
d) 这些都不是
Answer:c
说明: ptr 是指向常量整数的常量指针,这意味着指针及其内容都不会被修改,因此第 6 行和第 8 行是无效的,因为它们分别尝试修改内容和指针。
问题 5 以下 C++ 程序的输出是什么?
#include
using namespace std;
#include
int main()
{
char* str[] = { "AAAAA", "BBBBB", "CCCCC", "DDDDD" };
char** sptr[] = { str + 3, str + 2, str + 1, str };
char*** pp;
pp = sptr;
++pp;
printf("%s", **++pp + 2);
return 0;
}
a) BBBBB
b) 中国交建
c) BBB
d) 错误
Answer: c
说明: *str 是字符串的数组指针,**sptr 是数组指针(双指针),以相反的顺序指向 str字符串。 ***pp 也是一个指向 sptr 基地址的指针。 ++pp 将指向包含 str+2(“CCCCC”)的 sptr 的第一个索引。在 printf(“%s”, **++pp+2); ++pp 将指向 str+1,而 **++pp 将指向存储在 @str+1(“BBBBB)中的值。和 (**++pp)+2 将指向“BBBBB”的第二个索引,因此将打印 BBB。