2017-10-02 3 views
1

私は、luaのポインタと同様の方法でテーブルを使用できることを知っています。つまり、ポインタへのポインタはどのように見えますか?彼らはdp = {p = {}}のように見えるでしょうか?もしそうなら、以下のcコードに相当するものはluaにあるでしょうか?luaでポインタが相当するポインタへのポインタ

void InsertItem(node **head, node *newp){ 
    node **dp = head; 

    while((*dp) && (*dp)->value > newp->value 
    { 
     dp = &(*dp)->next; 
    } 

    newp->next = *dp; 
    *dp = newp; 
} 
+0

用語「二重のポインタが」、潜在的に混乱しています。用語「ポインタへのポインタ」はより明確である。 [tag:double-pointer]タグの説明ページを参照してください。 –

+0

@KeithThompson - 「ダブルダブルポインタ」は、「ダブル**」の正しい名前ですか? –

+0

正確には、テーブルへの参照は、動的に割り当てられたオブジェクトへのポインタと同様の方法で使用できます。 – IllidanS4

答えて

3

はい、ダブルポインタはネストしたテーブルとしてLuaに変換されます。

local function InsertItem(head, newitem) 
    while head.next and head.next.value > newitem.value do 
     head = head.next 
    end 
    newitem.next = head.next 
    head.next = newitem 
end 

-- Typical Usage: 
local head = {} 
InsertItem(head, {value = 3.14}) 
InsertItem(head, {value = 42}) 
InsertItem(head, {value = 1}) 

-- Now the data is the following: 
-- head = {next = elem1} 
-- elem1 = {next = elem2, value = 42 } 
-- elem2 = {next = elem3, value = 3.14} 
-- elem3 = {    value = 1 } 
0

CのポインタとLuaテーブルの大きな違いは、Cでは変数のアドレスを受け取り、それを変更する関数に渡すことができるということです。あなたはLuaでそれを行うことはできませんが、関数は常に変更された値を返すことができます。

dp = {p = {}}のように見えますか?

はい、それはLuaのポインタへのポインタに近いほど近くにあります。

もしそうなら、以下のcコードに相当するものは何でしょうか?

リンクされたリストは、再帰をよりスムーズに動作する傾向がある:それはタイプ ``ダブル*を参照しているので

local function InsertItem(head, newp) 
    if not head or head.value <= newp.value then 
    newp.next = head 
    return newp 
    end 
    head.next = InsertItem(head.next, newp) 
    return head 
end 
+0

'head not then'ブランチでは、この要素の以前の使用に由来するガベージを含む可能性があるので、' newp.next'を無効にしなければなりません。 –

+0

もう一度見て、私は 'if'と' elseif'ブランチが本当に同じことをやろうとしていることに気付きました。一定。 – luther

関連する問題