【问题标题】:Difference between the int * i and int** iint * i 和 int** i 之间的区别
【发布时间】:2021-12-21 18:53:37
【问题描述】:

int* iint** i 有什么区别?

【问题讨论】:

  • 所以你正在....寻找一些指针,然后... ;-)
  • 间接... :O)

标签: c++ c pointers


【解决方案1】:

int* 圆周率

pi 是一个指向整数的指针

int **ppi

ppi 是一个指向整数的指针。

编辑

你需要阅读一本关于指针的好书。我推荐Pointers on C by Kenneth Reek

【讨论】:

    【解决方案2】:

    指向整数值的指针

    int* i
    


    指向指向整数值的指针

    int** i
    

    (即,在第二种情况下,您将需要两次取消引用才能访问整数的值)

    【讨论】:

      【解决方案3】:
      • int* i : i 是指向 int 类型对象的指针
      • int** ii 是一个指向 int 类型对象的指针
      • int*** i : i 是一个指针,指向一个指向 int 类型对象的指针
      • int**** i : i 是一个指向指针的指针,该指针指向指向 int 类型对象的指针
      • ...

      【讨论】:

      • "...指向变量的指针..." 不一定是变量。事实上,在这种情况下,“变量”这个词可能有点模糊了意思。
      • @T.J. Crowder:即使是 const 变量也是变量。每次创建时可能会获得不同的值。
      • @Nathan 不在new int 中。这里没有变量。将variable 替换为object 是合适的。
      • 如果是C 而不是C++const 的值甚至不一定是恒定的。
      • 我不确定对象和变量之间的区别(因为变量是暗示对象的形容词)但我还是替换了它。
      【解决方案4】:

      我不认为这是特定于 opencv 的。

      int *i 正在声明一个指向 int 的指针。所以i 存储了一个内存地址,而 C 期望该内存地址的内容包含一个 int。

      int **i 正在声明一个指向...的指针。到一个整数。所以i 包含一个地址,在那个内存地址,C 期望看到另一个指针。那么,第二个内存地址应该是一个 int。

      请注意,当您声明一个指向 int 的指针时,实际的 int 并未分配。所以说int *i = 23 是有效的,也就是说“我有一个变量,我希望它指向包含一个int 的内存地址23”。但是,如果您尝试实际读取或写入内存地址 23,您可能会出现段错误,因为您的程序并不“拥有”那块 RAM。 *i = 100 会出现段错误。 (解决方法是使用malloc()。或者你可以让它指向一个现有的变量,如int j = 5; int *i = &j

      【讨论】:

        【解决方案5】:

        假设您是一名教师,并且必须给您的一个学生做笔记。

        int note;
        

        嗯……我的意思是全班

        int *class_note; /* class_note[0]: note for Adam; class_note[1]: note for Brian; ... */
        

        嗯……别忘了你有好几门课

        int **classes_notes; /* classes_notes[0][2]: note for Charles in class 0; ... */
        

        而且,您还在多家机构任教

        int ***intitute_note; /* institute_note[1][1][1]: note for David in class 1 of institute 1 */
        

        等等等等……

        【讨论】:

        • 这对初学者没有任何解释。
        【解决方案6】:

        两者都不是声明。声明语法不允许 () 围绕整个声明。这些() 在那里做什么?如果这应该是函数声明的一部分,请在您的问题中包含整个函数声明,因为在一般情况下,声明的实际含义可能取决于此。 (虽然不在这个。)

        至于区别...第一个有一个*,第二个有两个*s。它有帮助吗?可能不是。第一个声明i作为指向int的指针。第二个声明i 为指向int * 的指针。这有帮助吗?应该也不多吧。没有更具体的问题,很难提供更有意义的答案。

        请提供更多上下文。或者,如果这实际上是尽可能具体的,请阅读您最喜欢的有关指针的 C 或 C++ 书籍。这么宽泛的通用问题不是你在网上问的。

        【讨论】:

        • 不是我期望你的回应。不是我的DV。
        • @John 也不是我的 dv,但正是我期望从 @AndreyT 得到的回应 :)
        【解决方案7】:

        想象你有几个朋友,其中一个必须给你一些东西(宝藏...... :-) 说约翰有宝藏

        int treasure = 10000; // in USD, EUR or even better, in SO rep points
        

        如果你直接问约翰

        int john = treasure;
        int you = john;
        

        如果你不能加入约翰,但吉尔知道如何联系他,

        int john = treasure;
        int *gill = &john;
        int you = *gill;
        

        如果你连gill都不能加入,但必须先联系可以联系gill的jake

        int john = treasure;
        int *gill = &john;
        int **jake = &gill;
        int you = **jake;
        

        等等...指针只是间接的。

        这是我今天睡前的最后一个故事:-)

        【讨论】:

          【解决方案8】:

          我深信一张图片胜过千言万语。举个例子

          // Finds the first integer "I" in the sequence of N integers pointed to by "A" . 
          // If an integer is found, the pointer pointed to by P is set to point to 
          // that integer. 
          void f(int N, int *A, int I, int **P) {
            for(int i = 0; i < N; i++)
              if(A[i] == I) {
                // Set the pointer pointed to by P to point to the ith integer.
                *P = &A[i];
                return;
              } 
          }
          

          所以在上面,A 指向 N 个整数序列中的第一个整数。 P 指向一个指针,调用者将把指向找到的整数的指针存储在其中。

          int Is[] = { 1, 2, 3 };
          
          int *P;
          f(3, &Is[0], 2, &P);
          assert(*P == 2);
          

          &amp;P 用于将P 的地址传递给函数。此地址的类型为int **,因为它是指向 int 的指针的地址。

          【讨论】:

            【解决方案9】:

            注意

            int *i
            

            不能完全互换

            int i[]
            

            这可以看出以下将编译:

            int *i = new int[5];
            

            虽然这不会:

            int i[] = new int[5];
            

            第二个,你必须给它一个构造函数列表:

            int i[] = {5,2,1,6,3};
            

            您还可以使用 [] 表单进行一些检查:

                int *i = new int[5];
                int *j = &(i[1]);
                delete j;
            

            编译无警告,而:

                int i[] = {0,1,2,3,4};
                int j[] = {i[1]};
                delete j;
            

            会给出警告:

            警告 C4156:删除数组表达式而不使用数组形式 'delete';数组形式替换 警告 C4154:删除数组表达式;转换为提供的指针

            最后两个示例都会使应用程序崩溃,但第二个版本(使用 [] 声明类型)会发出警告,表明您正在自取其辱。

            (Win32 控制台 C++ 项目,Visual Studio 2010)

            【讨论】:

              【解决方案10】:

              int* i 是整数的内存位置的地址
              int** 是一个内存位置的地址 一个内存位置的地址 一个整数

              【讨论】:

                【解决方案11】:

                文本替换在这里很有用,但请注意不要盲目使用它,因为它会误导您(如下面的高级示例所示)。

                T var; // var has type T
                T* var; // var has type "pointer to T"
                

                无论 T 是什么,这都有效:

                int* var; // pointer to int
                char* var; // pointer to char
                double* var; // pointer to double
                
                // advanced (and not pure textual substitution):
                typedef int int3[3]; // confusing: int3 has type "array (of size 3) of ints"
                                     // also known as "int[3]"
                int3* var; // pointer to "array (of size 3) of ints"
                           // aka "pointer to int[3]"
                
                int (*var)[3]; // same as above, note how the array type from the typedef
                               // gets "unwrapped" around the declaration, using parens
                               // because [] has higher precedence than *
                               // ("int* var[3];" is an array (size 3) of pointers to int)
                

                这在 T 本身是指针类型时有效:

                typedef int* T; // T is a synonym for "pointer to int"
                T* var; // pointer to T
                        // which means pointer to pointer to int
                // same as:
                int** var;
                

                【讨论】:

                  【解决方案12】:

                  int* i; // i 是一个指向整数的指针。它可以保存一个整数变量的地址。

                  int** 我; // i 是一个指向整数的指针。它可以保存整数指针变量的地址。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-12-08
                    • 2016-08-01
                    • 2021-07-31
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多