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

Jos*_* D. 12 c string const

所以,我知道char const*,char*const和char const*const之间的区别.那些是:

char*the_string:我可以更改the_string指向的char,我可以修改它指向的char.

const char*the_string:我可以更改the_string指向的char,但是我无法修改它指向的char.

char*const the_string:我无法更改the_string指向的char,但我可以修改它指向的char.

const char*const the_string:我不能更改the_string指向的char,也不能修改它指向的char.

(来自const char*const与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;
}
Run Code Online (Sandbox Code Playgroud)

现在,标题应该是什么?

int countA(char const * string); 
int countA(char const * const string);
Run Code Online (Sandbox Code Playgroud)

我的感觉是我应该使用第二个,因为我不会修改指针本身,也不会修改数组的内容.但是,当我查看标准函数的标题时,他们使用第一个.例

char * strcpy ( char * destination, const char * source );
Run Code Online (Sandbox Code Playgroud)

为什么?

(事实上char const *对我来说没有意义,因为如果你正在考虑抽象字符串,要么你没有修改字符串(所以,char const * const因为你没有修改指针,也没有修改内容)或者你将修改string(所以只是char *因为你可以修改内容,你可能需要分配更多的内存,所以你可能需要修改指针)

我希望有人能够清楚地告诉我这件事.谢谢.

Dev*_*lar 6

在这种情况下,指针本身是否为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
Run Code Online (Sandbox Code Playgroud)

在内部strcpy,你需要迭代指向的数组destination,source无论如何.不将参数声明为const允许函数直接使用堆栈中的值,而无需先复制/转换它们.


cni*_*tar 5

const char * 代表合同.这是一个承诺,该函数不会使用该指针来修改用户传递的内容.指针本身是否恒定不太有价值.

因此,对于调用者来说,指针本身是否const与之无关.

在许多实现中,"字符串"函数定期修改传递的指针而不修改内容.如果规范(C标准)要求指针本身保持不变,那么它将成为所有实现的限制因素,而不会给调用者带来任何好处.


作为旁注,我认为你不应该做任何事情const,然后以自己的方式解决它.const如果感觉功能没有理由改变它,只需制作东西.简而言之,不要疯狂,它不是一颗银弹,可以成为挫折的秘诀.