2014-04-02 128 views
4

因此,自從我學習了c和C++課程並且我對c指針很感興趣之後(我即將在我的示例中使用new關鍵字,甚至認爲我知道malloc是C的方式)。我總是會回憶起我的老師總是強迫我們使用指針,她從不會對數組進行賦值,她向我們證明,當使用指針而不是使用數組時,彙編語言中需要的命令更少。我想繼續這個良好的做法,但我似乎在努力使用指針,特別是雙指針。關於指針的c/C++問題(雙指針)

可以說我想創建一個沒有使用C++字符串數據類型的字庫,而且我有一個類型爲char的雙指針。

int main() 
{ 
    string fileName = "file.txt"; 
    char** wordBank = null; 
    int wordCount = countWords(fileName); //somefunction to get word count 
} 

現在我需要分配的存儲空間爲整個銀行足夠大,但如何做到這一點,我相信它是財產以後這樣的IM不確定?

wordBank = new char*[wordCount]; 

現在我需要爲每個單詞的大小指定空間,這我仍然不確定aobut。

for(int i = 0; i < wordCount; i++) 
{ 
    wordLength = getWordLength(fileName, i); // some function to get word length of each... 
    //... word in the bank 
    (*wordBank) = new char[wordLength]; 
} 

好吧,我很困惑的最後一部分是通過函數傳遞雙指針。 可以說我有一個函數可以讓我操作整個單詞,讓我說只要傳遞單詞,我會通過函數調用傳遞什麼,函數定義會有什麼。假設我想傳遞整個銀行和一個可以移動指針的數字,我會通過函數調用傳遞什麼,以及函數定義具有什麼功能。對不起所有的問題通常如果我試圖通過編寫簡短的程序來自己回答這些問題,但是我很難編譯它。我很欣賞我收到的回覆。

+2

我試着遠離混合'*'和'[]'。 – motoku

+0

'wordBank [i] = new char [wordLength]'? – angdev

+1

我知道你在問題中說過你不想,但如果你使用C++(如'new'關鍵字所示),那麼我真的非常強烈推薦*使用'std :: string '。在這種情況下沒有什麼好的理由。它會爲你管理所有的內存管理,你不必擔心nul終結符,它會比自己完成所有的分配和拷貝效率低。你的'wordBank'數組也會更好,就像'std :: vector '一樣。同樣,它的效率也不低,但使用起來更容易和更安全。 –

回答

8

要分配銀行:

wordBank = malloc(wordCount * sizeof(char *)); 

要分配單個單詞:

char *addWord(char **wordBank, size_t idx, char *word) { 
    wordBank[idx] = malloc(strlen(word) + 1); 
    // this is how you pass a word 
    strcpy(wordBank[idx], word); 
    return wordBank[idx]; 
} 

// how you pass the wordBank: 
addWord(wordBand, index, someWord); 

但在裝配有更多的指令不一定是壞事。一個不變的開銷在編程中通常不是問題。我會使用std::stringstd::vector<string>,並將我的時間花在真正的問題上。至少不要調試malloc和frees,分配和測試NULL指針。

+0

阿門使用'std :: string'和'std :: vector '...但在你的例子中,使用new而不是malloc更好嗎? – jsantander

+0

可能在C++中更好,但它甚至沒有意義使用新的/刪除:) – perreal

+0

如果你有Posix,那麼'wordBank [i] = strdup(word)'有點短 –

1

我的看法:

wordBank = new char*[wordCount]; 

這是好的:因爲它在評論(@angdev)已表示你分配的char*

for(int i = 0; i < wordCount; i++) 
{ 
    wordLength = getWordLength(fileName, i); // some function to get word length of each... 
    //... word in the bank 
    wordBank[i] = new char[wordLength]; 
} 

wordCount元素的數組,用於我們需要分配內存中的每個項目(char *)。

一個字的小心是,你必須記得完成時釋放該內存......並且,你應該爲你所做的分配權操作取消分配:

  • 如果使用malloc() --->使用free()
  • 如果使用new --->使用delete`
  • 如果您使用new [] --->使用刪除[]`

最後,如果你需要修改一個函數內部的指針,使用參考指針:

char *myPointer=0; 

fillIt(myPointer); 

所以...如果你想fillIt()實際修改,其中myPointer點,該功能應該是:

void fillIt(char * & p) { ... } 

另外,您可以將其定義爲:

void fillIt(char ** p) { ... } 

,並調用它作爲

char *myPointer=0; 

fillIt(&myPointer);