【问题标题】:What does **p mean in c? [duplicate]c语言中的**p是什么意思? [复制]
【发布时间】:2022-01-08 18:06:16
【问题描述】:

我知道 int *p 是一个指针,但 int **p 到底是什么意思?那是什么类型的价值?当我现在说 p= something 时,它是如何工作的?我在使用指针创建二维数组时看到了这一点。

【问题讨论】:

  • 欢迎来到 Stack Overflow!请拿起tour(你会得到一个徽章!),环顾四周,阅读help center,尤其是How do I ask a good question?,我还推荐Jon Skeet的Writing the Perfect QuestionQuestion Checklist
  • 任何体面的 C 教程或课程都应该涵盖这一点。正如你所说,int * 是指向int 的指针。 int ** 是指向int 的指针。 (int ***是指向int的指针的指针,以此类推。)
  • @T.J Crowder 据我所知,指针的过程是存储另一个变量的地址,以便您可以使用 *p 访问变量并从指针更改其值。但我不明白 **p 是如何工作的,你能解释一下如何作为一个例子或过程吗?真的很混乱
  • 您能否澄清(即向我们展示一些代码)“我在使用指针创建二维数组时看到这一点”的意思?

标签: c


【解决方案1】:

简而言之,int **p; 是一个指向 int 的指针。所以,例如:

  int i, j;      // Integers;
  int *p = &i;   // Pointer to i
  *p = 1;        // i is now 1
  int *q = &j;   // Pointer to j
  int **s = &p;  // Pointer to p
  **s = 2;       // i is now 2
  s = &q;        // s now points to q (pointing to j)
  **s = 16;      // j is now 16
  s = &p;        // s now points to p (pointing to i)
  **s = 3;       // i is now 3
  p = &j;        // p now points to j
  **s = 17;      // j is now 17

指针指针的一个用例可能是需要输出指向int 的指针并返回成功/失败状态的函数:

  #include <stdbool.h>

  bool getIntHandle(unsigned handleId, int **handle)
  {
     static int handles[] = {12, 23, 34, 45};

     bool success = (handleId < sizeof(handles)/sizeof(handles[0])); // Check that handleId is in range
     if(success)
     {
         *handle = &handles[handleId];
     }
     return success;
  }

  int main(void)
  {
      int *handle;
      bool success = getIntHandle(2, &handle); // Get a pointer to the integer at index 2
      printf("*handle = %d\n", *handle);
      return 0;
  }

【讨论】:

  • 顺便说一下,int **p 可以用于二维数组,因为您可以将*p 解释为指向int 数组的指针,因此**p 指向@987654330 数组的数组@.
  • 那和这个不一样? Int *p int *s int i p=&i s=p *s=2 现在 i=2。为什么我不能这样做?
  • @rayo7 - 首先,如果没有;,很难阅读该代码(请在 cmets 中使用反引号)。其次,该代码中的y 是什么?它突然出现在p = &amp;y;
  • @rayo7 你的例子很混乱,:在p = &amp;yy 没有定义。
  • @rayo7 如果您的意思是p=&amp;i;(并添加;s),那么您的示例应该没问题。
【解决方案2】:

p 是一个指向int 的指针。它是int **p 类型,变量p 存储一个地址。

这是一个使用示例。 p 是一个由两个整数指针组成的数组。第一个指针p[0] 指向一个由 3 个整数组成的数组,第二个指向一个由 4 个整数组成的数组(组合起来称为不规则数组):

#include <stdio.h>
#include <stdlib.h>

int main() {
    int **p = malloc(2 * sizeof(int *));
    printf("p = %p\n", p);

    p[0] = malloc(3 * sizeof(int));
    printf("p[0] = %p\n", p[0]);
    p[0][0] = 0;
    p[0][1] = 1;
    p[0][2] = 2;

    p[1] = malloc(4 * sizeof(int));
    printf("p[1] = %p\n", p[1]);
    p[1][0] = 3;
    p[1][1] = 4;
    p[1][2] = 5;
    p[1][3] = 6;

    free(p[0]);
    free(p[1]);
    free(p);
    return 0;
}

然而,最常见的用途是传递给函数的常规二维数组,该函数降级为指向指针的指针。

【讨论】:

  • 但是将地址存储在其他指针的指针中是不是更容易 maje int *p int *l 和 p=l?我不明白:(
  • 在这里使用二维数组确实会让您的答案感到困惑。 (还)不是我的反对票。
  • @Jabberwocky 公平点,op 提到“带有指针的二维数组”。这是我提出它的唯一原因。我认为添加了一个更好的示例,但欢迎进一步的反馈。
  • @AllanWind 好的,现在更有意义了。赞成。
猜你喜欢
  • 2014-05-22
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 2015-05-20
  • 2011-07-10
  • 2020-06-03
  • 1970-01-01
  • 2011-01-14
相关资源
最近更新 更多