如果我有以下指针变量声明:
int * a;
int ** c;
关于类型和每个将包含的值,它将如下所示:
a
的类型为int*
,并且会保留memory address
*a
的类型为int
,并且将保存指针指向的变量的值
c
的类型为int**
,并且会保留????????????????????
c*
的类型为int*
,并且将保存指向它的指针的内存地址
c**
的类型为int
,假设指针c
指向指针b
,指针b
指向变量{{1}这里,保持的值将是变量a
这种方式是否正确,除了我不确定的a
?
感谢。
答案 0 :(得分:7)
int *a;
int **c;
你对a
是正确的。更常见的是a
拥有pointer to int
。
c
的类型为int**
,并且会保留pointer to a pointer to int
。
*c
的类型为int*
,并且会保留pointer to int
。
**c
的类型为int
,并且将包含整数值。 {} {}}指向c
和b
指向b
是正确的。
请参阅cdecl获取一些帮助。 :)
答案 1 :(得分:2)
c的类型为int **,并将保留????????????????????
'c'也包含一个内存地址,就像'a'一样。不同之处在于,取消引用时,'c'将返回另一个内存地址。你只是添加了另一个间接层。
答案 2 :(得分:2)
在您的示例中,c
将包含指向int*
的指针;也就是说,c
是指向指针的指针。它可以用于多维数组(如矩阵),它可以用作函数参数来更改用户的int*
。
答案 3 :(得分:2)
- a的类型为int *,并将保存内存地址
正确
- * a的类型为int,它将保存指针指向
的变量的值不完全是:* a将是对地址指向的变量的引用。你在尝试* a = 8时看到了这一点;和int * x =&(* a))。 如果它是一个值你无法改变它。但由于它是一个参考,因此值被“路由”到原始位置......在这种情况下,内存指向。
- c的类型为int **,并将保留???????????????????????
c保存一个指向指向int的内存地址的内存地址。
* c包含对指向int的内存地址的引用。所以你可以这样做:* c = a;
** c与* a相同。
答案 4 :(得分:1)
每个指针都保存内存地址。在这种情况下,c
是指向int*
的指针,因此它将保存这样一个变量的内存地址。
通常,双指针用于在C中创建动态多阵列。您可以看到它here
答案 5 :(得分:1)
C的类型为int *。从中可以看出,它将保存int *类型的数据,其本身就是一个内存地址。 这个概念被称为远指针,并且可以有多个远指针达到一定的限制。
与int ** c一样,你也可以将int *** d指向int ** c。这就像一个队列,每个指针指向下一个指针,前面有数据作为实际变量。
答案 6 :(得分:0)
我能想到的最简单的事情就是玩空间。编译器并不在乎,但由于声明的语法和用法相同(按设计),它使推理更容易:
假设:
int ***a; // declaration
int*** a; // type of a is an int*** (read: pointer to pointer to pointer to int)
int** *a; // the type of the object pointed by a (*a) is int**
int* **a; // the type of **a is int*
int ***a; // the type of ***a is int
免责声明:这与数据类型有关。是否可以在运行时取消引用指针是一个不同的问题(它已被初始化,是否指向有效的内存......?)