gpt4 book ai didi

c++ - 为什么这两个代码片段彼此等价(指针)

转载 作者:太空宇宙 更新时间:2023-11-04 05:19:26 25 4
gpt4 key购买 nike

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

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

vs.

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

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


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


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


|数据| *下一步| <--- 当前


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

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

最佳答案

这两个片段是完全等价的;在这两种情况下,*不是 取消引用运算符(如果它出现在表达式中,它就会是),但它只是用于声明指针的标记。换句话说,这里的 * 逻辑上 1Node 一起(指定类型 Node*,即“指向 Node2”的指针,而不是 current

(对于两个完全不同的事物(声明中的指针说明符,表达式中的一元运算符)这种令人困惑的重用相同字符3)来自于这样一个事实,即 C 认为“声明应该模仿用法",因此,由于要使用 * 访问指针的值,它甚至用于声明它们。)

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


  1. 遗憾的是,在语法上它与 current 一致,因为在声明中“指针类型说明符”绑定(bind)到特定变量;即,如果您编写 int * ptr1, ptr2;ptr1 将是 int * 类型,而 ptr2将是一个普通的 int

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

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

关于c++ - 为什么这两个代码片段彼此等价(指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18790504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com