c/c++;指针问题(双指针) 这是我学习C语言和C++课程以来的一段时间,我对C指针很好奇(我想在我的例子中使用新的关键字,甚至我知道MalLC是C方式)。我总是记得我的老师总是强迫我们使用指针,她从不接受数组的作业,她向我们证明,当使用指针而不是数组时,汇编语言中所需的命令更少。我想继续这种良好的做法,但我似乎很难使用指针,特别是双磅 让我想创建一个不使用C++字符串数据类型的单词库,并且我有一个类型的字符指针。 int main() { string fileName = "file.txt"; char** wordBank = null; int wordCount = countWords(fileName); //somefunction to get word count }
现在我需要为整个银行分配一个足够大的内存空间,但我不确定如何做到这一点,我相信是这样的事情c/c++;指针问题(双指针) 这是我学习C语言和C++课程以来的一段时间,我对C指针很好奇(我想在我的例子中使用新的关键字,甚至我知道MalLC是C方式)。我总是记得我的老师总是强迫我们使用指针,她从不接受数组的作业,她向我们证明,当使用指针而不是数组时,汇编语言中所需的命令更少。我想继续这种良好的做法,但我似乎很难使用指针,特别是双磅 让我想创建一个不使用C++字符串数据类型的单词库,并且我有一个类型的字符指针。 int main() { string fileName = "file.txt"; char** wordBank = null; int wordCount = countWords(fileName); //somefunction to get word count },c++,c,pointers,double,C++,C,Pointers,Double,现在我需要为整个银行分配一个足够大的内存空间,但我不确定如何做到这一点,我相信是这样的事情 wordBank = new char*[wordCount]; 现在我需要为每个单词的大小分配特定的空间,我仍然不确定,但是 for(int i = 0; i < wordCount; i++) { wordLength = getWordLength(fileName, i); // some function to get word length of each... //...
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];
}
for(int i=0;i
好的,我不明白的最后一部分是通过函数传递双指针。
假设我有一个函数,它允许我操作一个完整的词,假设我只想传递这个词,通过函数调用传递什么,函数定义有什么。让我们假设我要传递整个银行和一个移动指针的数字,通过函数调用传递什么,函数定义有什么。很抱歉,如果我试图通过编写简短的程序来回答这些问题,通常会遇到很多问题,但我很难将其编译好。我感谢收到的回复。要分配银行:
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::string
和std::vector
并将时间花在实际问题上。至少不需要调试mallocs和free,分配和测试空指针。My take:
wordBank = new char*[wordCount];
这很好:您正在分配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];
}
所以。。。如果希望fillIt()
实际修改myPointer
指向的位置,函数应为:
void fillIt(char * & p) { ... }
或者,您可以将其定义为:
void fillIt(char ** p) { ... }
并将其作为
char *myPointer=0;
fillIt(&myPointer);
我尽量避免混淆<代码> */> >和<代码> []/Cord>。代码>词库[i] =新字符[WordLe] [/Cord] >我知道你在这个问题中说你不想,但是如果你使用C++(如<代码>新< /COD>关键字),那么我真的强烈建议使用<代码> STD::String 。在这种情况下,没有理由不这样做。它将为您处理所有的内存管理,您不必担心nul终止符,而且它的效率不会低于您自己进行所有的分配和复制。您的
wordBank
数组作为std::vector
也会更好。同样,它的效率并没有降低,但使用起来更容易、更安全。命令更少并不一定意味着性能更好。查找“过早优化”。我不认为这个概念是一个好的实践,而是相反。相信我,当你在任何地方使用new
或malloc
时,你会花更多的时间担心你的程序出了什么问题,而不是实际节省了多少性能。请注意使用std::string
和std::vector
。。。但是在你的例子中,使用新的代替Malc不是更好吗?在C++中更好,但是使用NeX/DELT是没有意义的:如果你有POSIX,那么<代码> WordBoo[i] = StrudUp(Word)是一个小的缺点,我可以给最后一段额外的投票吗?最后一段为1。此外,数组和指针访问之间的汇编语言差异往往是简单的算法。即使代码确实需要优化,它通常也会改变缓存未命中和/或不可预测的条件分支,从而产生很大的差异。
char *myPointer=0;
fillIt(&myPointer);