为什么这两个代码片段彼此相同(指针)

use*_*911 0 c c++ pointers

我正在编写一个函数来查找链表的长度.我的问题特定于指针的声明.

int lengthOfLinkedList(Node *head) 
{ 
Node* current = head; 
}

vs. 

int lengthOfLinkedList(Node *head) 
{
Node* current = NULL; 
current = head; 
}
Run Code Online (Sandbox Code Playgroud)

所以这是我的理解:在第一个例子中,声明了一个指向Node对象的指针,它取消引用头指针的地址.


| 内存地址| <---当前


这不是我想要做的.相反,我想尊重指针,以便我可以访问它指向的节点(这是我在第二个代码片段中所做的):


|数据|*未来| <---当前


所以现在我认为指针在初始化时的行为方式不同 - 当你使用('*')运算符初始化指针时,可以直接声明指向内存地址的指针,但是在初始化之后你不能再这样做了.那很奇怪..

我是对的还是还有其他事情发生?

Mat*_*lia 8

这两个片段完全相同; 在这两种情况下*没有的dereferentiation操作(因为这将是如果它发生在一个表达式),但它只是用来定义一个指针的令牌.换句话说,这里*逻辑上1Node(指定类型Node*,即"指向Node" 2的指针),而不是current.

(对于两个完全不同的东西(声明中的指针说明符,表达式3中的一元运算符),这种混淆重用相同的字符来自于C具有"声明应该模仿使用"的想法,因此,因为访问的值你使用的指针*,它甚至用来声明它们.)

在第一种情况下,current从第一种情况开始,以相同的值开始head,在第二种情况下首先将其初始化为NULL,然后将其更改为具有相同的值head; 在这两种情况下,在函数结束时结果完全相同.


  1. 遗憾的是,从语法上来看current,因为在声明中"指针类型说明符"绑定到特定变量; 即,如果你写int * ptr1, ptr2;,ptr1将是类型int *,而ptr2将是一个平原int.

  2. 从右到左阅读时最好理解指针声明(const char *:指向字符char * const常量的指针; :指向字符的常量指针;等等); 更一般的声明(例如函数指针)更加混乱.

  3. 此外,二进制乘法运算符,但通常没有混淆(它适用于不同的类型,并放在两个操作数之间).

  • @Theodoros:他们这样做是因为注释1中解释的原因.至于我,我在前后都放了空格,以激怒最大数量的人. (2认同)