Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么要使用;常数*”;在C中声明函数参数之前?_C_Constants_Function Declaration_Qualifiers - Fatal编程技术网

为什么要使用;常数*”;在C中声明函数参数之前?

为什么要使用;常数*”;在C中声明函数参数之前?,c,constants,function-declaration,qualifiers,C,Constants,Function Declaration,Qualifiers,我这个问题的意思是,为什么在argument1和argument2之前使用“const”,它不就是没有const的参数声明吗?康斯特对这个论点做了什么静态布尔示例(const char*argument1,const char*argument2){…}函数原型是函数与其用户之间的契约 函数参数声明中使用的限定符常量 bool example(const char * argument1, const char * argument2) 保证指向的对象不会更改 如果没有这样的保证,例如,您可能

我这个问题的意思是,为什么在argument1和argument2之前使用“const”,它不就是没有const的参数声明吗?康斯特对这个论点做了什么<代码>静态布尔示例(const char*argument1,const char*argument2){…}

函数原型是函数与其用户之间的契约

函数参数声明中使用的限定符常量

bool example(const char * argument1, const char * argument2)
保证指向的对象不会更改

如果没有这样的保证,例如,您可能无法将字符串文本传递给函数,因为更改字符串文本会导致未定义的行为

因此,限定符const使程序更加清晰和安全

我这个问题的意思是,为什么在argument1和argument2之前使用“const”,它不就是没有const的参数声明吗

您的示例涉及类型为
const char*
的函数参数。这里必须理解,该类型指定指向
const char
的指针,而不是指向char的
const
指针。也就是说,指针本身可以修改,但它不能用于修改它所指向的数据

这之所以有用,有几个原因,其中包括:

  • C允许将类型为
    char*
    的参数传递给类型为
    const char*
    的参数,但不能反过来传递。因此,如果函数不打算修改指向的数据,那么将参数声明为
    const char*
    将使函数适用于更多情况

  • 将参数声明为
    const char*
    可以向调用方保证,即使参数指向可修改的数据(即,具有类型
    char*
    ),函数实际上也不会修改该数据。在许多情况下,这是一个重要的保证

  • 作为前文的一个特例,作为函数参数显示的字符串文字会衰减为
    char*
    类型的指针,但如果结果指针用于修改字符串文字的值,则会出现未定义的行为。因此,不能假定将字符串文本传递给
    char*
    类型的参数是安全的,但将字符串文本传递给
    const char*
    类型的参数是合理安全的


相关:(不是问题本身,而是内容)它可以在没有常量的情况下生成。这是为了确保函数不会更改指向
argument1
的字符。另外,如果使用
const char*
调用函数,并且函数使用
char*
则丢弃const限定符(编译时会看到警告)。此外,如果您的函数在其参数为字符串文字时更改值,则会出现segmentaion错误。因此,每当函数不应该修改参数时,最好使用
const
@MickaelB。字符串文字是非常量的数组char@M.M好吧,我的坏消息,我会编辑它是一个非绑定契约,函数可能仍然会修改参数指向的内存(在某些情况下不会导致未定义的行为)@M.M您可以编写任何阻止契约的坏代码。但我认为这里没有什么可讨论的。是否违约是重要的。人们经常误解函数原型的含义,例如,他们认为它意味着函数不能改变指向的值,甚至指向的值不能通过任何方式改变