📜  C++ 程序的输出 |第 39 组(指针)

📅  最后修改于: 2022-05-13 01:56:10.802000             🧑  作者: Mango

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。