gpt4 book ai didi

const char * VS char const * const(不谈什么是const)

转载 作者:太空狗 更新时间:2023-10-29 16:46:44 29 4
gpt4 key购买 nike

所以,我知道了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 无关紧要,因为无论如何它都是按值传递的:无论 strcpysource 做什么都不会影响调用者的变量,因为 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 中,您需要在 destinationsource 指向的数组上迭代指针。不将参数声明为 const 允许函数直接使用堆栈中的值,而无需先复制/转换它们。

关于const char * VS char const * const(不谈什么是const),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11611564/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com