int* i
和int** i
之间的区别是什么?
答案 0 :(得分:23)
指向整数值的指针
int* i
指向指向整数值的指针
int** i
(即,在第二种情况下,您将需要两个dedeferrence来访问整数的值)
答案 1 :(得分:9)
int* i
:i
是指向int
int** i
:i
是指向int
int*** i
:i
是指向指向int
类型对象的指针的指针int**** i
:i
是指向指向类型为int
的对象的指针的指针的指针答案 2 :(得分:8)
答案 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; //我是一个指向整数指针的指针。它可以保存整数指针变量的地址。