C 中“*”、“*”和“*”指针之间的区别
Difference between "* " , " * " and " *" pointers in C
我正在从极客到极客学习图(邻接表),我看到了这段代码:
// A structure to represent an adjacency list node
struct AdjListNode
{
int dest;
struct AdjListNode* next;
};
// A structure to represent an adjacency liat
struct AdjList
{
struct AdjListNode *head; // pointer to head node of list
};
// A structure to represent a graph. A graph is an array of adjacency lists.
// Size of array will be V (number of vertices in graph)
struct Graph
{
int V;
struct AdjList* array;
};
我想知道两者的区别:
struct AdjListNode* next;
和 struct AdjListNode *head;
和 struct AdjListNode * head;
它们是一样的,只是写法不同"a pointer to a struct AdjListNode"。
正如其他人所说,这是一回事,但是,请看下面的示例:
int main() {
int* a = NULL , b;
b = 5;
a = &b;
printf("a = %p, *a = %d, b = %d", a, *a, b);
return 0;
}
输出:a = 000000000022FE44, *a = 5, b = 5
在第一行 int* a = 0 , b;
只有 a
是类型 int*
(又名指针),换句话说,*
只与第一个变量相关,这意味着 b
的类型是 int
其实就是一种风格,写法一样a+b
vs a + b
vs a+ b
.
但是,我想指出的是,在 C 中,在变量名旁边写星号是很常见的,就像这样:
int *p;
这样做的主要原因是你知道 p 是一个指针。特别是如果你在一行中声明多个变量,像这样:
int* pointer, not_a_pointer, *another_pointer;
相反,在 C++ 中,通常将星号放在类型旁边,因为它是关于类型的信息而不是变量:int* p
总结:
- 在 C 语言中,变量通常被读取为指向 int 类型的指针。
- 在 C++ 中,通常读取类型为 "pointer-to-int"
的变量
希望这是有道理的。
这个问题的答案是它们是一样的。
尽管它们都是一样的,但很有趣的是为什么它们实际上是一样的。
这是因为根据C标准6.4.6标点符号,字符“*”是标点符号。因此它不能是类型名称的一部分。
正如您在 6.4.6.2 中所读到的,标点符号是具有独立句法和语义意义的符号。
这就是为什么它与构成类型名称的普通字符不同,因此被解释为指针。因为它不能成为名称的一部分,所以编译器总是假设您一看到“*”就结束了类型的名称,对于 space 首先是白色 spaces 被简单地忽略了。
第 5.1.1.2 节 - 标准的翻译阶段描述了编译器如何处理 white-spaces。 (事实上,在标记化之后,它们不再重要)。
我认为它可能值得添加。
我正在从极客到极客学习图(邻接表),我看到了这段代码:
// A structure to represent an adjacency list node
struct AdjListNode
{
int dest;
struct AdjListNode* next;
};
// A structure to represent an adjacency liat
struct AdjList
{
struct AdjListNode *head; // pointer to head node of list
};
// A structure to represent a graph. A graph is an array of adjacency lists.
// Size of array will be V (number of vertices in graph)
struct Graph
{
int V;
struct AdjList* array;
};
我想知道两者的区别:
struct AdjListNode* next;
和 struct AdjListNode *head;
和 struct AdjListNode * head;
它们是一样的,只是写法不同"a pointer to a struct AdjListNode"。
正如其他人所说,这是一回事,但是,请看下面的示例:
int main() {
int* a = NULL , b;
b = 5;
a = &b;
printf("a = %p, *a = %d, b = %d", a, *a, b);
return 0;
}
输出:a = 000000000022FE44, *a = 5, b = 5
在第一行 int* a = 0 , b;
只有 a
是类型 int*
(又名指针),换句话说,*
只与第一个变量相关,这意味着 b
的类型是 int
其实就是一种风格,写法一样a+b
vs a + b
vs a+ b
.
但是,我想指出的是,在 C 中,在变量名旁边写星号是很常见的,就像这样:
int *p;
这样做的主要原因是你知道 p 是一个指针。特别是如果你在一行中声明多个变量,像这样:
int* pointer, not_a_pointer, *another_pointer;
相反,在 C++ 中,通常将星号放在类型旁边,因为它是关于类型的信息而不是变量:int* p
总结:
- 在 C 语言中,变量通常被读取为指向 int 类型的指针。
- 在 C++ 中,通常读取类型为 "pointer-to-int" 的变量
希望这是有道理的。
这个问题的答案是它们是一样的。 尽管它们都是一样的,但很有趣的是为什么它们实际上是一样的。
这是因为根据C标准6.4.6标点符号,字符“*”是标点符号。因此它不能是类型名称的一部分。
正如您在 6.4.6.2 中所读到的,标点符号是具有独立句法和语义意义的符号。
这就是为什么它与构成类型名称的普通字符不同,因此被解释为指针。因为它不能成为名称的一部分,所以编译器总是假设您一看到“*”就结束了类型的名称,对于 space 首先是白色 spaces 被简单地忽略了。
第 5.1.1.2 节 - 标准的翻译阶段描述了编译器如何处理 white-spaces。 (事实上,在标记化之后,它们不再重要)。
我认为它可能值得添加。