关于指针(双指针)的 C/C++ 问题

c/c++ questions on pointers (double pointers)

本文关键字:指针 C++ 问题 于指针      更新时间:2023-10-16

所以自从我上 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 = 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 指针方面。

我的看法:

wordBank = new char*[wordCount];

这很好:您正在分配一个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];
}

正如注释 (@angdev) 中所述,对于数组(的 char * )中的每个项目,我们需要分配内存。

一个词 os 警告是,您必须记住在完成后释放该内存......并且您应该使用正确的操作为您所做的分配进行释放:

  • 如果您使用malloc() --->请使用free()
  • 如果您使用new --->请使用删除'
  • 如果您使用new [] --->请使用删除 []'

最后,如果需要修改函数内的指针,请使用对指针的引用:

char *myPointer=0;
fillIt(myPointer);

所以......如果你想让fillIt()实际修改myPointer点的位置,函数应该是:

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

或者,您可以将其定义为:

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

并将其调用为

char *myPointer=0;
fillIt(&myPointer);