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。 (事实上​​,在标记化之后,它们不再重要)。

我认为它可能值得添加。