为什么要使用;常数*”;在C中声明函数参数之前?
我这个问题的意思是,为什么在argument1和argument2之前使用“const”,它不就是没有const的参数声明吗?康斯特对这个论点做了什么<代码>静态布尔示例(const char*argument1,const char*argument2){…}函数原型是函数与其用户之间的契约 函数参数声明中使用的限定符常量为什么要使用;常数*”;在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) 保证指向的对象不会更改 如果没有这样的保证,例如,您可能
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您可以编写任何阻止契约的坏代码。但我认为这里没有什么可讨论的。是否违约是重要的。人们经常误解函数原型的含义,例如,他们认为它意味着函数不能改变指向的值,甚至指向的值不能通过任何方式改变