指向結構體的指標p++與p = p->next的區別
阿新 • • 發佈:2018-11-16
在編寫 遍歷連結串列的過程中需要讓指向結構體的指標移動到下一節點這一操作的過程中,發現了使用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+1
與p->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 較合理。