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

在编写 遍历链表的过程中需要让指向结构体的指针移动到下一节点这一操作的过程中,发现了使用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;
}

运行结果如图:
在这里插入图片描述
运行后发现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

这时候你也许发现了,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

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

猜你喜欢

转载自blog.csdn.net/weixin_42912350/article/details/83514272
今日推荐