我有一个类,它从需要 char* fileName
的文件加载数据,但对如何以这种方式使用它没有清楚的了解。
// Constructor
Foo(char* fileName)
我知道 char
只接受一个字符,但有人可以澄清如何使用它吗?
最佳答案
char*
是“指向 char
的指针”。也就是说,它保存 char
对象的地址。使用指向数组中第一个元素的指针是很常见的。也就是说,如果将地址加 1,您将获得数组中下一个元素的地址。
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ │ │ │ │ │ │ │ │ │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
^
└─ pointer to first element of an array
C 风格的字符串通常存储在 char
数组中。例如,这里我们将字符串 "filename.txt"
存储在 char
数组中:
char str[] = "filename.txt";
数组的名称可以隐式转换为指向其第一个元素的指针。也就是说,str 可以像指向 f 字符的指针一样使用。该指针的类型为 char*
。
这就是为什么我们经常将 char*
变量视为 C 风格字符串。尽管它实际上只是一个指针,但通常假定它们指向数组中的第一个 char
。该数组通常也被假定为以 null 结尾,这意味着有一个值为 0
的 char
标记字符串的结尾。该字符串在内存中看起来像这样:
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ f │ i │ l │ e │ n │ a │ m │ e │ . │ t │ x │ t │\0 │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
因此,由于数组到指针的转换,您可以将数组 str
传递给您的构造函数,如下所示:
Foo foo(str);
但请注意,直接将字符串传递给构造函数在 C++03 中已被弃用,并且在 C++11 中完全无效。你不能这样做:
Foo foo("filename.txt");
问题在于该字符串文字的类型为“array of 13 const
char
”。转换为指针后,它是一个const char*
。您无法将 const char*
传递给 char*
参数,因为这会违反 const
正确性。
关于c++ - 使用 char 指针加载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15878844/