2011-07-09 148 views
2

我沒想到能夠增加指向結構內存塊中結構的指針。但它似乎工作。有沒有這種情況不起作用?如果我創建了一個「列表」的結構,那麼我應該始終能夠增加指向它們的指針,C會計算出要移動多少個字節?C結構指針迭代

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

struct User { 
    int id; 
    char name[32]; 
    float net_worth; 
}; 
typedef struct User User; 


int main(int argc, char** argv) { 
    User* u1 = (User*)malloc(sizeof(User)); 
    u1->id = 1; 
    strcpy(u1->name, "Mike"); 
    u1->net_worth = 43.45; 
    User* u2 = (User*)malloc(sizeof(User)); 
    u2->id = 2; 
    strcpy(u2->name, "Pablo"); 
    u2->net_worth = -2.00; 
    User* u3 = (User*)malloc(sizeof(User)); 
    u3->id = 3; 
    strcpy(u3->name, "Frederick"); 
    u3->net_worth = 7329213.45; 

    User** users = (User**)malloc(sizeof(User)*10); 
    *users = u1; 
    printf("%s\n", ((User*)(*users))->name); 
    *users++; 
    *users = u2; 
    printf("%s\n", ((User*)(*users))->name); 
    *users++; 
    *users = u3; 
    printf("%s\n", ((User*)(*users))->name); 


    return 0; 

} 
+0

究竟是什麼問題,你看到它的工作原理是正確的? –

+0

是的,我只是想確保我沒有失去任何東西,我理解它。 –

+2

您使用「*用戶++」表達式的任何特定原因? '*'是多餘的(它只是提及'++'的結果)。這也令人困惑,因爲看起來你試圖增加'*用戶'而不是'用戶'本身。 –

回答

5

這是非常設計。假設你有

User userArray[16]; 

你可以或者通過userArray[1],或*(userArray + 1)訪問第二用戶,或者獲得一個指向第一個元素,並通過++增加它。

3

很簡單:是的。這就是指針具有類型的原因。

+0

我不能用單詞yes發表評論,因爲它需要15個字符 – Ulterior

0

是的。

(文字,以填補30個字符後要求)

1

是的,這是它的意思是如何工作的。向數組中的指針加1會實際上前進到下一個元素(C會調整內存地址的正確數量和結構的大小)。

只有當你走得太遠的時候,這是不行的。如果指針指向數組內或(僅用於算術),則只有指針纔有效(對於解引用和指針算術)。所以:

int x[10]; 
int *px = &(x[9]); // Points to last element, okay to dereference. 
px++;    // Points one beyond, still okay for aritmetic. 
px++;    // Don't use this for anything. 

被認爲是未定義的行爲,如果您以後嘗試使用指針。

+0

只是一個FIY:可以有一個指向末尾的指針(並使用該指針進行指針算術),但解除引用並不好。 – pmg

+0

第二個FIY:你可能會寫x + 9而不是&(x [9])(x也有int *類型)。 – jforberg

+0

@jforberg,像我們這樣經驗豐富的代碼猴可能會意識到沒有什麼區別,但我從教學經驗中發現,初學者更容易理解「元素編號9的地址」而不是「將9添加到數組」。 – paxdiablo

0

和C會找出移動多少個字節?

是的。這就是爲什麼C對可以放在結構中的東西施加限制:給定類型的結構的每個實例必須具有相同的大小,並且編譯器必須能夠在編譯時計算出該大小,爲這個計劃工作。