【发布时间】:2014-05-13 03:28:26
【问题描述】:
自从我学习 c 和 c++ 课程以来已经有一段时间了,我对 c 指针很好奇(我打算在我的示例中使用 new 关键字,即使我知道 malloc 是 C 方式)。我总是记得我的老师总是强迫我们使用指针,她永远不会对数组进行赋值,她向我们证明,当你使用指针而不是使用数组时,汇编语言中需要的命令更少。我想继续这种良好的做法,但我似乎在努力使用指针,特别是双指针。
假设我想在不使用 c++ 字符串数据类型的情况下创建一个单词库,并且我有一个 char 类型的双指针。
int main()
{
string fileName = "file.txt";
char** wordBank = null;
int wordCount = countWords(fileName); //somefunction to get word count
}
现在我需要为整个银行分配足够大的内存空间但我不确定如何执行此操作我相信它是这样的?
wordBank = new char*[wordCount];
现在我需要为每个单词的大小专门分配空间,我仍然不确定。
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];
}
好吧,我感到困惑的最后一部分是通过函数传递双指针。 假设我有一个函数可以让我操纵整个单词,假设我只想传递单词,我将通过函数调用传递什么以及函数定义将具有什么。假设我想传递整个银行和一个将移动指针的数字,我将通过函数调用传递什么以及函数定义将具有什么。很抱歉通常会出现所有问题如果我尝试通过编写短程序自己回答这些问题,但我很难让它编译。感谢收到的回复。
【问题讨论】:
-
我尽量避免混用
*和[]。 -
wordBank[i] = new char[wordLength]? -
我知道您在问题中说过您不想这样做,但如果您使用的是 C++(如
new关键字所示),那么我真的会强烈推荐使用std::string。在这种情况下没有充分的理由不这样做。它会为您处理所有的内存管理,您不必担心 nul 终止符,而且它的效率不会低于自己进行所有分配和复制。您的wordBank数组也可以作为std::vector<std::string>更好。同样,它的效率并没有降低,但使用起来更容易、更安全。 -
更少的命令并不一定意味着更好的性能。查找“过早优化”。我不认为这个概念是好的做法,而是相反。相信我,当您在任何地方使用
new或malloc时,您将花费更多的时间来担心您的程序出了什么问题,而不是实际节省的性能。