[英]Confusion about const char * declarations in C
我知道这可能看起来像一个愚蠢的问题,但我真的很难理解 C 代码的一些特定示例,这些示例涉及const char *
类型的声明。
让我想到它的例子是在Parsing csv with c的答案中。 特别是,function 定义为:
const char* getfield(char* line, int num)
{
const char* tok;
for (tok = strtok(line, ";");
tok && *tok;
tok = strtok(NULL, ";\n"))
{
if (!--num)
return tok;
}
return NULL;
}
我对const char *
声明的理解是它定义了一个指向不可变字符数组的可变指针。 该数组在编译时分配在数据段中。 但是在这种情况下(以及许多其他代码示例), const char *
声明不适用于字符串文字。 如果在 function 执行之前不知道字符串的实际值,那么如何在编译时为此分配 memory?
这个
const char* tok;
在堆栈上创建一个指针。 它有一个未定义的值,它指向任何地方
这个
for (tok = strtok(line, ";");
然后让它指向line
中的某个地方(取决于内容)
你的评论
我对 const char * 声明的理解是它定义了一个指向不可变字符数组的可变指针。 该数组在编译时分配在数据段中。
第一句话,几乎,它创建了一个指针,该指针可能指向一个不可变的字符数组。 像这样
const char * msg = "hello world";
但也无处可去
const char * msg = NULL;
或者一个可变的字符数组
char msg[] = "HelloWorld"; // mutable
const char *msgconst = msg;
第二句
这个数组在编译时赋值在数据段
是的,如果这是一个文字。 我又喜欢这个例子
const char*msg = "Hello World";
但是msgconst
赋值不是这样的,字符在栈上
希望这可以帮助
编辑
指针指向它被告知要做的事情,使其成为常量或不常量对数据的位置影响为零。 数据就在哪儿。(.),你要考虑数据是从哪里创建的,跟指针无关,指针可以指向一个字面量,栈数据,static数据(数据段可变)。 堆。
为什么要使用常量
如果字符串是不可变的,那么指针必须是常量。 由于历史原因,C 允许您将文字分配给非常量指针,c++ 则不允许
您要明确表示不应更改此字符串。 在您的代码案例中,您真的不应该弄乱 strtok 正在处理的字符串。 虽然它返回 char*,但这是一个很好的做法
像 strlen 这样不改变传递给它们的字符串的函数将它们的 arguments 声明为 const char*,这是它们合同的一部分:我们不改变字符串
但是使用const
这个词不会改变存储的任何内容,也不会在任何地方节省任何空间
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.