为什么fputs()需要常量作为第一个参数而不是fputc()? intfputc(intc,文件*stream); int fputs(常量字符*s,文件*stream);

为什么fputs()需要常量作为第一个参数而不是fputc()? intfputc(intc,文件*stream); int fputs(常量字符*s,文件*stream);,c,function,parameters,declaration,definition,C,Function,Parameters,Declaration,Definition,为什么fputc()的声明中不需要const int c;参数的“顶层”是复制的,而不是引用的,因此const所要做的就是防止被调用函数修改其自身的参数副本 同样,请注意,对于fputs,只有指向的值是const;参数不是const char*const s,因为额外的常量只会限制被调用方修改其指针副本指向的位置的能力;const保证仅适用于所指向的(共享)值。无需设置第一个参数const;参数的“顶层”是复制的,而不是引用的,因此const所要做的就是防止被调用函数修改其自身的参数副本 同样,

为什么fputc()的声明中不需要
const int c
;参数的“顶层”是复制的,而不是引用的,因此
const
所要做的就是防止被调用函数修改其自身的参数副本


同样,请注意,对于
fputs
,只有指向的值是
const
;参数不是
const char*const s
,因为额外的常量只会限制被调用方修改其指针副本指向的位置的能力;
const
保证仅适用于所指向的(共享)值。

无需设置第一个参数
const
;参数的“顶层”是复制的,而不是引用的,因此
const
所要做的就是防止被调用函数修改其自身的参数副本


同样,请注意,对于
fputs
,只有指向的值是
const
;参数不是
const char*const s
,因为额外的常量只会限制被调用方修改其指针副本指向的位置的能力;
const
保证仅适用于所指向的(共享)值。

在函数声明中将参数标记为
const
没有意义。参数是按值传递的,因此该参数无论如何都是一个副本。它不影响函数的调用方式


然而,
const char*s
并不意味着
s
const
。这个声明的意思是
s
是指向
常量字符的指针;i、 e.
fputs
函数承诺不会通过给定的指针进行写入。此外,还有一个从
char*
const char*
的隐式转换(但不是相反),这意味着
fputs
可以用只读和可写字符串调用。

在函数声明中将参数标记为
const
。参数是按值传递的,因此该参数无论如何都是一个副本。它不影响函数的调用方式


然而,
const char*s
并不意味着
s
const
。这个声明的意思是
s
是指向
常量字符的指针;i、 e.
fputs
函数承诺不会通过给定的指针进行写入。此外,还有一个从
char*
const char*
的隐式转换(但不是相反),这意味着
fputs
可以用只读和可写字符串调用。

const
修饰符阻止函数更改输入参数

fputc
函数使用
int c
作为值类型的输入。因为参数是按值传递的,所以函数只能更改内部副本,而不能更改原始值

fputs
函数使用
char*s
作为指针类型的输入,因此该函数可以更改指向的内存。
const
修饰符通过防止函数更改指向内存来保护指向内存

注1:函数
fputs
中的
const
修饰符位于
char
类型(
const char*s
)上,这意味着无法更改指向的内存。如果
const
位于输入参数
s
char*const s
)上,它不会保护指向的内存,它只会保护指针本身,指针本身无论如何都是通过值传递的


注2:如注释中所述和中所示,如果常量修饰符位于函数声明中而不在函数定义中,则它无效。

常量修饰符阻止函数更改输入参数

fputc
函数使用
int c
作为值类型的输入。因为参数是按值传递的,所以函数只能更改内部副本,而不能更改原始值

fputs
函数使用
char*s
作为指针类型的输入,因此该函数可以更改指向的内存。
const
修饰符通过防止函数更改指向内存来保护指向内存

注1:函数
fputs
中的
const
修饰符位于
char
类型(
const char*s
)上,这意味着无法更改指向的内存。如果
const
位于输入参数
s
char*const s
)上,它不会保护指向的内存,它只会保护指针本身,指针本身无论如何都是通过值传递的


注2:如注释中所述和中所示,如果常量修饰符位于函数声明中而不在函数定义中,则它无效。

const char*s
并不意味着
s
必须指向常量。这意味着不允许
fputs
修改
s
const char*s
所指向的内容并不意味着
s
必须指向常量。这意味着当编译器确定函数类型时,不允许
fputs
修改
s

所指向的内容,然后丢弃参数的高级限定符

这两个函数声明

int fputc(int c, FILE *stream);
int fputc( const int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int fputs(const char * const s, FILE *stream);
声明同一个函数

这两个函数声明

int fputc(int c, FILE *stream);
int fputc( const int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int fputs(const char * const s, FILE *stream);
还声明同一个函数

因此,高级限定符const的含义不是函数的用户,而是函数的内部定义。在任何c
int fputs(const char *s, FILE *stream);
int fputc( const int c, FILE *stream);