【发布时间】:2021-12-21 18:53:37
【问题描述】:
int* i 和 int** i 有什么区别?
【问题讨论】:
-
所以你正在....寻找一些指针,然后... ;-)
-
间接... :O)
int* i 和 int** i 有什么区别?
【问题讨论】:
int* 圆周率
pi 是一个指向整数的指针
int **ppi
ppi 是一个指向整数的指针。
编辑:
你需要阅读一本关于指针的好书。我推荐Pointers on C by Kenneth Reek。
【讨论】:
指向整数值的指针
int* i
指向指向整数值的指针
int** i
(即,在第二种情况下,您将需要两次取消引用才能访问整数的值)
【讨论】:
int* i : i 是指向 int 类型对象的指针
int** i :i 是一个指向 int 类型对象的指针
int*** i : i 是一个指针,指向一个指向 int 类型对象的指针
int**** i : i 是一个指向指针的指针,该指针指向指向 int 类型对象的指针
【讨论】:
new int 中。这里没有变量。将variable 替换为object 是合适的。
C 而不是C++,const 的值甚至不一定是恒定的。
我不认为这是特定于 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)
【讨论】:
假设您是一名教师,并且必须给您的一个学生做笔记。
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 */
等等等等……
【讨论】:
两者都不是声明。声明语法不允许 () 围绕整个声明。这些() 在那里做什么?如果这应该是函数声明的一部分,请在您的问题中包含整个函数声明,因为在一般情况下,声明的实际含义可能取决于此。 (虽然不在这个。)
至于区别...第一个有一个*,第二个有两个*s。它有帮助吗?可能不是。第一个声明i作为指向int的指针。第二个声明i 为指向int * 的指针。这有帮助吗?应该也不多吧。没有更具体的问题,很难提供更有意义的答案。
请提供更多上下文。或者,如果这实际上是尽可能具体的,请阅读您最喜欢的有关指针的 C 或 C++ 书籍。这么宽泛的通用问题不是你在网上问的。
【讨论】:
想象你有几个朋友,其中一个必须给你一些东西(宝藏...... :-) 说约翰有宝藏
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;
等等...指针只是间接的。
这是我今天睡前的最后一个故事:-)
【讨论】:
我深信一张图片胜过千言万语。举个例子
// 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 的指针的地址。
【讨论】:
注意
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)
【讨论】:
int* i 是整数的内存位置的地址
int** 是一个内存位置的地址 一个内存位置的地址 一个整数
【讨论】:
文本替换在这里很有用,但请注意不要盲目使用它,因为它会误导您(如下面的高级示例所示)。
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;
【讨论】:
int* i; // i 是一个指向整数的指针。它可以保存一个整数变量的地址。
int** 我; // i 是一个指向整数的指针。它可以保存整数指针变量的地址。
【讨论】: