我有一个从需要的文件中加载数据的类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数组中的第一个。该数组也最常被假定为以空值结尾,这意味着有一个charwith 值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";[除了stringetc ] 在这种情况下,char*指针用于指向该数组的第一个字符。当您必须打印它时,编译器会获取指针 [ka 基地址] 给出的地址,并通过获取每个字符的地址来继续打印每个字符。a的地址char是通过在基地址上加下标得到的,直到\n
所以你可以利用
char* fileName = "myFile.txt"; or char fileName[11] = "myFile.txt";
Foo(fileName);
或 Foo("myFile.txt");