PTA程序设计填空:值是什么

若有定义int a = 10, *p1 = &a, **p2 = &p1;,则表达式 **p2 的值是

就是a的值10啊

p1指向a的地址,p2指向p1的地址,那么 *p2就是得到p1,**p2就是得到a的

值是10
解释如下:

int a = 10, * p1 = &a, ** p2 = &p1; 
等价于:
int a = 10;
int* p1 = &a; //注意,这里的意思是声明p1是一个int类型的指针,p1指向了a的地址
int** p2 = &p1; //声明一个二级指针p2,p2指向了p1的地址

那么,对于表达式(注意,这里是表达式,不再是声明!!!):
*p1 就是取p1指向的内存的值,也就是a的值。
*p2 就是p2指向的内存的值,p2指向的是p1的地址,所以*p2得到的就是p1的地址
**p2 就先当与*p1,*p1也就是a的值,所以**p2的值就是a的值,也就是10

*p2的值为10.
首先定义了变量a,其值为10;
然后定义了一个int
的指针p1, p1的值为变量a的地址,
最后定义了一个指向int*指针的指针p2, 它保存的值是用 取址符号&取到的变量p1的地址。
*为取值符号。
*p2 => 取到的及时p2本身保存的地址的值,即p1的值,而p1的值为a的地址
再加一个取值符号,
**p2 =>就是取a的地址对应的值,即10.

**p2 = 10;

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    **p2 的值是 10。具体解决方案如下:

    首先,定义了一个 int 类型变量 a,其值为 10;再定义一个指向 a 的指针 p1,它的值是 a 的地址;接着,定义了一个指向指针 p1 的指针 p2,它的值是指针 p1 的地址。

    换句话说,p2 存储的是一个指向指针 p1 的指针,p1 存储的是一个指向 int 变量 a 的指针,那么 p2 就等价于 (p2),即先解析 p2,得到指向 p1 的指针,再解析 p1,得到指向 a 的指针,最后取 a 的值即可,即 p2 = *p1 = a = 10。

    代码示例:

    #include <iostream>
    using namespace std;
    
    int main() {
      int a = 10, *p1 = &a, **p2 = &p1;
      cout << **p2 << endl;  // 输出 10
      return 0;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

该回答引用chatgpt:
根据定义,p1 是一个指向 a 的指针,p2 是一个指向 p1 的指针,因此 **p2 就是 *p1 的值,即 a 的值。

因此,**p2 的值是 10。