在c ++中理解带有文件i / o的指针

时间:2010-01-24 08:35:51

标签: c++ pointers

我正在努力更好地掌握指针。我的课程分配是为原型void OpenFile(const char *fileName, ifstream &inFile)创建函数。

 void OpenFile(const char *fileName, ifstream &inFile) 
 {
  inFile.open(FILENAME, ios_base::in);
  if (!inFile.is_open()) {
   cerr << "Could not open file " << fileName << "\n";
   exit(EXIT_FAILURE);
  }
  else {
   cout << "File Open successful";
  }
 }

 //FILENAME is defined as: const char * const FILENAME = "file.txt";

 // function is called in main with:  OpenFile(FILENAME, inFile);

我想我不明白的是const char *和&amp;对于这两个论点。我猜第一个参数是一个const char *,因为这是赋值定义FILENAME的方式。但在这种情况下我是否必须使用指针?我能完成吗

    const char FILENAME = "file.txt";

并在我的OpenFile中让第一个参数只接受一个const char。然后,为什么我需要参考我的函数的第二个参数?绝对混淆何时使用指针以及何时使用引用。谢谢!

4 个答案:

答案 0 :(得分:2)

const char *(或char const *)是指向无法修改的字符(char)的指针(const)。通常这意味着一个C风格的字符串,其中实际上有一个字符数组,指针指向第一个字符串,字符串的最后一个字符后面有一个'\ 0'字符,告诉程序字符串结束那里

您可以执行const char foo ='a',在其中存储单个字符,但是将字符串分配到const char变量是不可能的,因为将数组(C字符串是什么)放入字符变量中没有意义。

您也可以使用指针作为第二个参数,但是当您不需要特定于指针的功能时,使用引用是C ++中更好的样式。引用总是指向一个元素(不是像指针一样的数组),它们总是指向某个地方(不像NULL指针那样)。它们也更容易使用,因为您可以使用引用变量,就像它指向的对象一样,需要使用指针(* ptr)来访问指向对象。

在尝试练习之前,您真正需要的是一些基本的C ++课程。阅读有关课程书或其他材料的指针和参考资料。我会链接到在线资料,但我不知道任何足够好的材料。

答案 1 :(得分:2)

  • fileName是传统的C字符串。您通过将指针传递给字符串的第一个字符来将字符串传递给函数。

  • inFile是对ifstream变量的引用。因为它是通过引用传递的,所以您的函数可以修改它并将其返回给调用程序。在这种情况下,您的函数将打开文件并返回打开的文件变量。

答案 2 :(得分:2)

首先,让我说你的函数看起来有点奇怪,如果你传入一个参数fileName然后使用FILENAME并且fileName只用于错误输出。我想这不太正确。

其次,对const char *问题。 char本身只是一个字符(字符),因此只有一个字符。 const char FILENAME =“file.txt”因此不起作用。相反,你需要一个字符数组(const char FILENAME [] = ...),或者在C中完成使用指向文本内存位置的指针,即char *。

当你似乎使用STL时,最好放弃char *并转换为std :: string。

第三,指针与参考通常是品味问题。最后他们都做了同样的事情,在编译器中他们实际上是相同的。使用中的一个区别是您不能传递空(null)引用,但您可以传递空指针。所以建议通常是使用引用,如果你真的需要传递一个对象,并指向任何可能是可选的指针(在这种情况下你必须处理ptr == NULL)。此外,C字符串是char *和其他手动分配的内存通常通过指针发送。

答案 3 :(得分:1)

char类型适用于单个字符(例如char example = 'e')。所以const char FILENAME = "file.txt"无法编译。

这是C字符串上的nice tutorial