为什么第二行输出的是指针p1的值,第四行输出的是指针p的值,两个要输出值不应该是写*p1和**p吗,

img


为什么第二行输出的是指针p1的值,第四行输出的是指针p的值,两个要输出值不应该是写*p1和**p吗,

  • 在本题中,定义了字符变量 c 并赋值为 'a',然后定义了一个 char* 类型的指针变量 p1,并将 c 的地址赋值给了它,即 p1 = &c。这样,p1 就指向了变量 c 所在的内存地址。接着,又定义了一个 char** 类型的指针变量 p,并将 p1 的地址赋值给了它,即 p = &p1。这样,p 就指向了指针变量 p1 的内存地址。可能你理解错了,认为是输出c字符。
  • 如果将 printf 语句改为 printf("%x\n",*p1),输出的是指针 p1 所指向的内存单元存储的值,即输出变量 c 的值。
    由于 c 为一个字符类型的变量,其地址被赋给了 p1,所以 *p1 表示指向 c 的地址,即输出变量 c 中存储的字符 'a' 的 ASCII 码值(十六进制格式)。

这里不是指输出变量的值,而是变量的地址

第二行输出的是指针p1的值,指针p1的值 = 变量 c 的地址值。
第四行输出的是指针p的值, 指针p的值 = 指针变量 p1 的地址值。

指针p的值就是指针的地址呀
**p不是指针p的值,而是指针指向的地址的值

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7524722
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:关于指针*p,指针的指针**p,以及二维数组的理解
  • 除此之外, 这篇博客: 递归计算P函数中的 递归计算P函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • (15分)
    本题要求实现下列函数P(n,x)的计算,其函数定义如下:
    在这里插入图片描述
    函数接口定义:
    double P( int n, double x );
    其中n是用户传入的非负整数,x是双精度浮点数。函数P返回P(n,x)函数的相应值。题目保证输入输出都在双精度范围内。

    裁判测试程序样例:
    #include <stdio.h>

    double P( int n, double x );

    int main()
    {
    int n;
    double x;

    scanf("%d %lf", &n, &x);
    printf("%.2f\n", P(n,x));
    
    return 0;
    

    }

    /* 你的代码将被嵌在这里 */
    输入样例:
    10 1.7
    输出样例:
    3.05

    答案:
    double P( int n, double x ){
    double r;
    if(n0)
    r=1;
    else if(n
    1)
    r=x;
    else
    r=((2*n-1)*P(n-1,x)-(n-1)*P(n-2,x))/n;
    return r;
    }

    本题根据题干要求内容可以直接解答;
    不需要考虑如何使用递归。

  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    问题1:为什么在以下代码中,第二行输出的是指针p1的值而不是p1的值,第四行输出的是指针p的值而不是p的值?我认为正确的输出应该是p1和**p,请问我的理解有误吗?

    答:是正确的。代码中的第4行p不是一个指向指针的指针,而是一个一级指针,指向变量p1的地址。因此,在输出的时候,需要输出指针p的地址,才能够读取到这个地址中的变量。

    问题2:如何实现函数P(n, x)的递归计算?

    答:

    double P(int n, double x) {
        if (n == 0) 
          return 1;
        else if (n == 1)
          return x;
        else
          return ((2 * n - 1) * P(n - 1, x) - (n - 1) * P(n - 2, x))/n;
    }
    

    问题3:输入样例为“10 1.7”,是什么格式的输入?

    答:输入样例为一个整数和一个浮点数,中间用空格隔开。

    问题4:如何通过指针变量p去掉字符串中字母之间的星号?

    答:

    #include <stdio.h>
    #include <string.h>
    int main() {
      char s[100];
      scanf("%s", s);
      char *p = &s[0];
      for (int i = 0; s[i]; i++)
        if (s[i] != '*') {
          *p = s[i];
          p++;
        }
      *p = '\0';
      printf("%s", s);
      return 0;
    }