【发布时间】:2013-01-04 22:11:43
【问题描述】:
我正在阅读 Kernighan 和 Richie 的The C Programming Language中关于数组和指针的章节。
他们举了一个例子:
/* strlen: return length of string s */
int strlen(char *s)
{
int n;
for (n = 0; *s != '\0'; s++)
n++;
return n;
}
然后说:
“由于s是一个指针,递增它是完全合法的; s++ 对调用 strlen 的函数中的字符串没有影响,而只是增加 strlen 指针的私有副本。这意味着像这样的调用
strlen("hello, world"); /* string constant */
strlen(array); /* char array[100]; */
strlen(ptr); /* char *ptr; */
一切正常。”
除了第一个调用示例之外,我觉得我理解了所有这些:为什么或如何将字符串文字 "hello, world" 视为 char *s?这是一个怎样的指针?该函数是否将此字符串文字分配为其局部变量*s 的值,然后使用s 作为数组名称/指针?
【问题讨论】:
-
关于字符串、数组、指针及其关系的一些非常好的问题/答案。 Just one example。恭喜你至少对这个主题进行了一些研究,这比几乎任何其他人在发布有关该主题的问题之前所做的都要大得多。写得很好的问题。
-
另请注意,K&R 在良好的编程实践方面缺乏很多。将字符串传递给不修改它的函数时,应将参数声明为
const char* s。这在传递字符串文字时尤其重要。如果您的函数尝试写入*s,您将调用未定义的行为并且程序可能会崩溃。 -
感谢大家把这篇文章写成这么棒的帖子!很难/不可能选择一个接受的答案。带着你的答案,我回去阅读了本书中这个例子之前的部分。我认为我之前没有注意到的关键句子是
By definition, the value of a variable of expression of type array is the address of element zero of the array。因此,当我在函数中使用字符串文字作为参数时,我传递的不是字符串文字本身,而是“类型数组”,它是指向字符串文字中第 0 个索引的指针,它是一个数组。跨度> -
谢谢伦丁!实际上,我在在这里发帖之前尝试自己回答这个问题时遇到了这个问题。更多关于你提到的内容(使用
const char *s而不是char *s)可以在securecoding.cert.org/confluence/display/seccode/…找到。