- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以,我知道了char const *、char * const 和char const * const 之间的区别。那些是:
char* the_string : I can change the char to which the_string points, and I can modify the char at which it points.
const char* the_string : I can change the char to which the_string points, but I cannot modify the char at which it points.
char* const the_string : I cannot change the char to which the_string points, but I can modify the char at which it points.
const char* const the_string : I cannot change the char to which the_string points, nor can I modify the char at which it points.
(来自 const char * const versus const char *?)
现在,我的问题是:假设我正在编写一个不会修改传递给它的 C 字符串的函数,例如:
int countA(??? string) {
int count = 0;
int i;
for (i=0; i<strlen(string); i++) {
if (string[i] == 'A') count++;
}
return count;
}
现在,标题应该是什么?
int countA(char const * string);
int countA(char const * const string);
我的感觉是我应该使用第二个,因为我不会修改指针本身,也不会修改数组的内容。但是当我查看标准函数的标题时,他们使用第一个。示例
char * strcpy ( char * destination, const char * source );
为什么?
(事实上 char const *
对我来说没有意义,因为如果你考虑抽象字符串,要么你没有修改字符串(所以,char const * const
因为你没有修改指针,也没有修改内容)或者你将修改字符串(所以只是 char *
因为,你可能会修改内容并且你可能需要分配更多的内存,所以你可能需要修改指针)
我希望有人能给我讲清楚这一切。谢谢。
最佳答案
在这种情况下,指针本身是否为 const 无关紧要,因为无论如何它都是按值传递的:无论 strcpy
对 source
做什么都不会影响调用者的变量,因为 strcpy
将操作堆栈上调用者的 source
的副本,而不是原始的。请注意,我说的是指针值,而不是指针指向的内容,显然不应该更改,因为它是源参数。
char dest[10];
char const * source = "Hello";
strcpy( dest, source );
// no matter what strcpy does, the value of source will be unchanged
在 strcpy
中,您需要在 destination
和 source
指向的数组上迭代指针。不将参数声明为 const 允许函数直接使用堆栈中的值,而无需先复制/转换它们。
关于const char * VS char const * const(不谈什么是const),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11611564/
是否有任何 Microsoft Azure 组件可用于 Azure HDInsight 上的 KNOX 和 Falcon。 无论如何,我们的大部分工作流程和日程安排将通过 Azure 数据工厂进行。我
我尝试ethereumjs-util在 react-native 中,首先 ethUtil.privateToPublic 工作正常,然后当使用 ethUtil.publicToAddress 时会收
在本文中:http://www.ibm.com/developerworks/java/library/j-jtp1029/index.html Brian Goetz 指出:“仅仅因为类 X 是针对
Linux 内核对 Rust 的支持一直是个备受关注的话题。此前,Linus Torvalds 曾回应称可以默认启用 Rust 支持;Linux 内核的稳定分支维护者 Greg Kroah-Ha
Douglas Crockford 就 ES6 的“The Better Parts”发表了精彩的演讲。除此之外,他 encourages a move away from prototypal in
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一名优秀的程序员,十分优秀!