我正在编写一个函数来查找链表的长度.我的问题特定于指针的声明.
int lengthOfLinkedList(Node *head)
{
Node* current = head;
}
vs.
int lengthOfLinkedList(Node *head)
{
Node* current = NULL;
current = head;
}
Run Code Online (Sandbox Code Playgroud)
所以这是我的理解:在第一个例子中,声明了一个指向Node对象的指针,它取消引用头指针的地址.
| 内存地址| <---当前
这不是我想要做的.相反,我想尊重指针,以便我可以访问它指向的节点(这是我在第二个代码片段中所做的):
|数据|*未来| <---当前
所以现在我认为指针在初始化时的行为方式不同 - 当你使用('*')运算符初始化指针时,可以直接声明指向内存地址的指针,但是在初始化之后你不能再这样做了.那很奇怪..
我是对的还是还有其他事情发生?
这两个片段完全相同; 在这两种情况下*是没有的dereferentiation操作(因为这将是如果它发生在一个表达式),但它只是用来定义一个指针的令牌.换句话说,这里*逻辑上1与Node(指定类型Node*,即"指向Node" 2的指针),而不是current.
(对于两个完全不同的东西(声明中的指针说明符,表达式3中的一元运算符),这种混淆重用相同的字符来自于C具有"声明应该模仿使用"的想法,因此,因为访问的值你使用的指针*,它甚至用来声明它们.)
在第一种情况下,current从第一种情况开始,以相同的值开始head,在第二种情况下首先将其初始化为NULL,然后将其更改为具有相同的值head; 在这两种情况下,在函数结束时结果完全相同.
遗憾的是,从语法上来看current,因为在声明中"指针类型说明符"绑定到特定变量; 即,如果你写int * ptr1, ptr2;,ptr1将是类型int *,而ptr2将是一个平原int.
从右到左阅读时最好理解指针声明(const char *:指向字符char * const常量的指针; :指向字符的常量指针;等等); 更一般的声明(例如函数指针)更加混乱.
此外,二进制乘法运算符,但通常没有混淆(它适用于不同的类型,并放在两个操作数之间).