当前位置:   article > 正文

指向结构体的指针p++与p = p->next的区别_p->next和p++

p->next和p++

在编写 遍历链表的过程中需要让指向结构体的指针移动到下一节点这一操作的过程中,发现了使用p++,程序不按预期执行,结果发现p++与p = p->next 的区别。

#include <stdio.h>
#include <stdlib.h>

typedef struct Lnode
{
    int a;
    struct Lnode * next;
} Lnode , * Lp;

int main(void)
{
	// 定义了3个结点

    Lnode node1;	
    Lnode node2;
    Lnode node3;
    
	// 定义了3个指向结点的指针
    Lp p1 = &node1;		// p1 指向 第1个结点
    Lp p2 = &node2;		// p2 指向 第2个结点
    Lp p3 = &node3;		// p3 指向 第3个结点

    printf("node 2 address is  %p \n", &node2);
    printf("node1.next is      %p \n", node1.next);

    printf("p2:      %p \n", p2);// 查看p2 指向的结点的地址,也就是node2的地址
    printf("p2 + 1 : %p \n", p2+1);
    
    printf("p2->next %p \n", p2 = p2->next);

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

运行结果如图:
在这里插入图片描述
运行后发现p2+1p->next指向的地址不同,

node 2 address is  0061fef4	
node1.next is      0061fef4
// 这里前六位数值相同,我们只看后两位	 
p2:      0061fef4		// f4 的十进制为 244
p2 + 1 : 0061fefc		//fc 的十进制为 252
p2->next 0061feec   	//ec的十进制为 236
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这时候你也许发现了,p2->next的地址比p2低8个字节,说明结点的存储是从高地址向低地址进行的, 但是p2+1使得p2增加了p2指向的类型(这里是struct node 占8字节)所占字节大小,所以p2+1指向的并非下一个结点。

	printf("size of Lnode %zd \n", sizeof(Lnode));		8bytes
    printf("size of Lp %zd \n", sizeof(Lp));			4bytes
    printf("size of int %zd \n", sizeof(int));			4bytes
  • 1
  • 2
  • 3

在这里插入图片描述
Ps,在不同的实现下,结构体变量所占的字节数不一定是 其成员所占字节数总和。有的系统可能使用内存对齐规则,并且有的系统还可能从低地址向高地址存放结点。总之使用p = p->next 较合理。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/79770
推荐阅读
相关标签
  

闽ICP备14008679号