我有一个从需要的文件中加载数据的类char* fileName
,但对如何以这种方式使用它没有清楚的了解。
// Constructor
Foo(char* fileName)
我知道 achar
只包含一个字符,但有人可以澄清如何使用它吗?
Achar*
是“指向”的指针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
数组中的第一个。该数组也最常被假定为以空值结尾,这意味着有一个char
with 值0
标记字符串的结尾。字符串在内存中看起来像这样:
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ 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*
. 您不能将 a 传递const char*
给char*
参数,因为它会违反-const
正确性。
从历史上看,C 的创建者认为我们可以在可以传递数组的地方传递指针,反之亦然。
如果你稍微思考一下这个概念,它们是密切相关的。指针可以浏览内存的许多部分(包括一个数组,它是一个彼此相辅相成的内存字节)。
使用指针而不是数组,并使用 ++ 和 -- 运算符(我们称之为指针算术),您可以在内存中移动,就像在数组中移动索引值一样。
C 字符串中的规范是使用最后的 '\0' 字符来分隔字符串的结尾。将您的指针移动到此结束,然后您将拥有整个字符串数组。
Achar*
是指向字符的指针。文件名可以是字符数组char fileName[12] = "myFile.txt";
[除了string
etc ] 在这种情况下,char*
指针用于指向该数组的第一个字符。当您必须打印它时,编译器会获取指针 [ka 基地址] 给出的地址,并通过获取每个字符的地址来继续打印每个字符。a的地址char
是通过在基地址上加下标得到的,直到\n
所以你可以利用
char* fileName = "myFile.txt"; or char fileName[11] = "myFile.txt";
Foo(fileName);
或 Foo("myFile.txt");