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

Posted

技术标签:

【中文标题】int * i 和 int** i 之间的区别【英文标题】:Difference between the int * i and int** i 【发布时间】:2010-09-25 14:43:12 【问题描述】:

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

【问题讨论】:

所以你正在....寻找一些指针,然后... ;-) 间接... :O) 【参考方案1】:

指向整数值的指针

int* i

指向指向整数值的指针

int** i

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

【讨论】:

【参考方案2】: 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 的值甚至不一定是恒定的。 我不确定对象和变量之间的区别(因为变量是暗示对象的形容词)但我还是替换了它。【参考方案3】:

int* 圆周率

pi 是一个指向整数的指针

int **ppi

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

编辑

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

【讨论】:

【参考方案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】:

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

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;

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

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

【讨论】:

【参考方案7】:

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

// 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 的指针的地址。

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

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

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

【讨论】:

【参考方案10】:

注意

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)

【讨论】:

【参考方案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 是一个指向整数的指针。它可以保存整数指针变量的地址。

【讨论】:

以上是关于int * i 和 int** i 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

float和int有啥区别?

int * const * p和int ** const p之间有什么区别

.NET基础之:i++和i=i+1和++i的区别

函数参数中 int * array 和 int array[] 的区别

i++和++i区别

两个方法调用之间的区别