int * i 和 int** i 之间的区别
Posted
技术标签:
【中文标题】int * i 和 int** i 之间的区别【英文标题】:Difference between the int * i and int** i 【发布时间】:2010-09-25 14:43:12 【问题描述】:int* i
和 int** i
有什么区别?
【问题讨论】:
所以你正在....寻找一些指针,然后... ;-) 间接... :O) 【参考方案1】:指向整数值的指针
int* i
指向指向整数值的指针
int** i
(即,在第二种情况下,您将需要两次取消引用才能访问整数的值)
【讨论】:
【参考方案2】:int* i
: i
是指向 int
类型对象的指针
int** i
:i
是一个指向 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);
&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 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
int * const * p和int ** const p之间有什么区别