2

我有一个从需要的文件中加载数据的类char* fileName,但对如何以这种方式使用它没有清楚的了解。

// Constructor
Foo(char* fileName)

我知道 achar只包含一个字符,但有人可以澄清如何使用它吗?

4

3 回答 3

3

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正确性。

于 2013-04-08T12:25:24.850 回答
0

从历史上看,C 的创建者认为我们可以在可以传递数组的地方传递指针,反之亦然。

如果你稍微思考一下这个概念,它们是密切相关的。指针可以浏览内存的许多部分(包括一个数组,它是一个彼此相辅相成的内存字节)。

使用指针而不是数组,并使用 ++ 和 -- 运算符(我们称之为指针算术),您可以在内存中移动,就像在数组中移动索引值一样。

C 字符串中的规范是使用最后的 '\0' 字符来分隔字符串的结尾。将您的指针移动到此结束,然后您将拥有整个字符串数组。

于 2013-04-08T12:24:08.710 回答
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");

于 2013-04-08T12:27:43.733 回答