在C中将函数参数声明为const

时间:2018-08-08 10:22:44

标签: c const

在C中将函数的参数声明为const有什么用?它对性能有影响吗?

例如为什么您更喜欢f1而不是f2?还是f2到f1?

void f1(const char* arg) {
/* some code */
}

void f2(char* arg) {
/* some code */
}

4 个答案:

答案 0 :(得分:3)

void f1(const char *arg)中的

参数arg本身不是const限定的,它被定义为指向该函数不应修改的char数组的指针。乍一看,这对读者非常有用,即函数f1不会修改它收到的字符串。

例如strcpy<string.h>中声明为:

char *strcpy(char *dest, const char *src);

第一个参数指向的数组被修改,它是目标数组,第二个参数指向未经修改的源数组。

这种const限定类型是病毒式的:一旦将参数定义为指向const对象,则只能将其传递给具有类似const限定参数的函数。 / p>

关于对性能的影响,没有负面影响。一些编译器甚至可能会从这种资格中受益,并生成更好的代码。

因此,在您的示例中,如果f1不修改arg指向的数组,除非您需要将f1存储在类型为void (*)(char*)的函数指针中,并且无法更改此类型,我强烈建议您使用:

void f1(const char *arg);

答案 1 :(得分:2)

const char* arg表示arg是指向常量char的指针。如果您尝试更改arg指向的数据,则会收到一条错误消息,内容为:error: assignment of read-only location ‘*arg’。但是,您可以更改arg中包含的地址。

与此相反,通过删除const关键字,可以声明arg指向 的数据。

您的偏好应基于您的需求。看看this了解更多信息。

针对您的评论:char * const arg表示arg是指向char的常量(暂停一秒钟)指针。因此,您无法更改arg中包含的地址,并且 可以更改位于该地址的数据。

答案 2 :(得分:2)

void foo(const char *arg)

声明指向const char的指针。您不能更改引用的对象,但可以更改指针

void foo(char * const arg)

声明指向char的const指针。您不能更改指针,但是可以更改引用的对象

void foo(const char * const arg)

声明指向const char的const指针。您不能更改指针和引用的对象

声明参数可以实现许多编译时间优化,并且可能对所生成代码的性能产生重大影响。

使用const作为不应更改的参数和变量被认为是一种很好的做法。被称为“常量正确性”

更多阅读:restrict关键字。

答案 3 :(得分:1)

您更喜欢

void f1(const char* arg) 

如果您不想通过arg修改arg指向的对象。 但是您可以修改arg本身。

您更喜欢

void f2(char* arg) 

如果要通过arg修改arg指向的对象。