关于指针(双指针)的 C/C++ 问题
c/c++ questions on pointers (double pointers)
所以自从我上 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::string
和std::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);
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错