int * i和int ** i之间的区别

时间:2010-09-25 14:43:13

标签: c++ c pointers

int* iint** i之间的区别是什么?

12 个答案:

答案 0 :(得分:23)

指向整数值的指针

int* i


指向指向整数值的指针

的指针
int** i

(即,在第二种情况下,您将需要两个dedeferrence来访问整数的值)

答案 1 :(得分:9)

  • int* ii是指向int
  • 类型对象的指针
  • int** ii是指向int
  • 类型对象的指针的指针
  • int*** ii是指向指向int类型对象的指针的指针
  • int**** ii是指向指向类型为int的对象的指针的指针的指针
  • ...

答案 2 :(得分:8)

  

int * pi

pi是指向整数

的指针
  

int ** ppi

ppi是指向整数的指针。

编辑

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

答案 3 :(得分:6)

我认为这不是特定于opencv。

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

int **i声明指向指针的指针。到一个int。所以i包含一个地址,并且在该内存地址处,C期望看到另一个指针。那么,第二个内存地址应该保持一个int。

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

答案 4 :(得分:3)

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

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的杰克

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

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

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

答案 5 :(得分:3)

我深信一张图片胜过千言万语。采取以下示例

// 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);

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

答案 6 :(得分:2)

假设你是老师,必须给你的一个学生做笔记。

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 */

等等...

答案 7 :(得分:1)

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

至于差异......第一个中有一个*,第二个中有*个。有帮助吗?可能不是。第一个声明i为指向int的指针。第二个声明i为指向int *的指针。这有帮助吗?可能也不多。如果没有更具体的问题,很难提供更有意义的答案。

请提供更多背景信息。或者,如果这实际上是它可以获得的具体内容,请阅读您最喜欢的关于指针的C或C ++书籍。这些广泛的通用问题不是你在网上提出的问题。

答案 8 :(得分:1)

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

的存储器位置的地址的存储器位置的地址

答案 9 :(得分:0)

请注意

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 :(得分:0)

文本替换在这里很有用,但要小心使用它,因为它会误导你(如下面的高级示例所示)。

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;

答案 11 :(得分:0)

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

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

相关问题