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

时间:2013-09-13 15:54:15

标签: c++ c pointers

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

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

vs. 

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

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


|内存地址| < --- current


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


|数据| *未来| < --- current


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

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

4 个答案:

答案 0 :(得分:8)

两个片段完全相同;在这两种情况下* 都不是解除引用运算符(就像它出现在表达式中一样),但它只是用于声明指针的标记。换句话说,此处*逻辑 1 Node一致(以指定类型Node*,即“指向Node 2 ),而不是current

(对于两个完全不同的东西(声明中的指针说明符,表达式 3 中的一元运算符),这种混淆重用相同的字符来自C这样的事实:“声明应该模仿使用“所以,既然要访问使用*的指针的值,它甚至用来声明它们。)

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


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

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

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

答案 1 :(得分:1)

在任何一个例子中都没有解除引用。两者都只是将传递的指针分配给一个新变量,然后在函数退出时将其丢弃。

考虑这个序列

int x = 0;
x = 2;

VS

int x = 2;

答案 2 :(得分:0)

初始化赋值不同;你没有在初始化中取消引用current*仅用于指示current具有指针类型,仅此而已。

C和C ++声明语法基于表达式的类型,而不是对象。例如,如果您有一个指向整数的指针,并且想要获得该整数值,则必须使用一元*运算符取消引用指针:

x = *p;

表达式的类型 *pint,因此p的声明是

int *p;

在声明中,*令牌仅用于提供其他类型信息;即,p是指向int的指针。重要的是要注意,对于指针声明T *p*绑定到声明符,而不是类型说明符。 IOW,T *p;被解析为T (*p);。因此,如果要在单个声明中声明多个指针,则必须编写

T *p, *q, *r;

在这种情况下,pqr中的每一个都是指向T类型的指针。

许多C ++程序员使用T* p;样式,因为他们认为强调对象p的类型更为重要,并且有时它会使代码的意图更清晰。但是,它始终会被解析为T (*p);

答案 3 :(得分:-1)

为了帮助将指针声明与取消引用分开,请在取消引用时考虑使用箭头运算符->。例如,*current.data相当于current->data; current->next将为您提供当前下一个指针所指向的节点。