C 功能正常,无“故障”;常数;旗帜"的重要性;常数;?

C 功能正常,无“故障”;常数;旗帜"的重要性;常数;?,c,constants,C,Constants,下面的函数使用const char*s1 该函数的作用可能并不重要。如果字符串 包含允许字符以外的字符。如果是,则返回0 没有 如果我从中删除const部分,该函数似乎工作得很好 如果没有它似乎可以正常工作,为什么我需要该函数中的const术语?它的重要性是什么?这意味着什么 使用 不使用 此函数中的const可防止您在变量指向的内存中写入内容 这里,仅当值不等于\0时才检查该值,因为您只执行读取操作,所以该值是正常的 int TEST (const char *s1) { char

下面的函数使用
const char*s1

该函数的作用可能并不重要。如果字符串 包含允许字符以外的字符。如果是,则返回0 没有

如果我从中删除
const
部分,该函数似乎工作得很好

如果没有它似乎可以正常工作,为什么我需要该函数中的
const
术语?它的重要性是什么?这意味着什么

  • 使用
  • 不使用

此函数中的const
可防止您在变量指向的内存中写入内容

这里,仅当值不等于
\0
时才检查该值,因为您只执行读取操作,所以该值是正常的

int TEST (const char *s1) {
    char * s2= "o123";
    return s1[ strspn(s1, s2) ] != '\0';
} 
如果执行此操作,请尝试通过
s1
指针写入:

int TEST (const char *s1) {
    char * s2= "o123";
    s1[0] = '4'; //Error, s1 is const pointer, can't write to memory pointed to by s1
    return s1[ strspn(s1, s2) ] != '\0';
} 

const
指针在您的情况下意味着此函数
不应向输入指针写入任何数据,只能执行读取操作。实际上,您可以更改
s1
点的位置,不允许通过
s1
写入内存。这是为了防止现在意外写入的任何错误,因为在某些情况下可能会导致未定义的行为。

const
在该函数中防止您在变量指向的内存中写入内容

这里,仅当值不等于
\0
时才检查该值,因为您只执行读取操作,所以该值是正常的

int TEST (const char *s1) {
    char * s2= "o123";
    return s1[ strspn(s1, s2) ] != '\0';
} 
如果执行此操作,请尝试通过
s1
指针写入:

int TEST (const char *s1) {
    char * s2= "o123";
    s1[0] = '4'; //Error, s1 is const pointer, can't write to memory pointed to by s1
    return s1[ strspn(s1, s2) ] != '\0';
} 

const
指针在您的情况下意味着此函数
不应向输入指针写入任何数据,只能执行读取操作。实际上,您可以更改
s1
点的位置,不允许通过
s1
写入内存。这是为了防止现在意外写入的任何错误,因为在某些情况下可能会导致未定义的行为。

当您有
const char*s1
时,您告诉编译器您不会修改
s1
指向的内存内容。它是编译器的语义信号,因此不会在函数中出错(尝试更改内容将导致错误)。它还允许编译器添加一些优化


但更重要的是,它是一个信号,让其他程序员阅读您的代码,并使用您的函数。在“其他程序员”中,我也包括了几周、几个月或几年后的你,那时你可能会回到代码中,忘记了它的细节。

当你有
const char*s1
时,你告诉编译器你不会修改
s1
指向的内存内容。它是编译器的语义信号,因此不会在函数中出错(尝试更改内容将导致错误)。它还允许编译器添加一些优化


但更重要的是,它是一个信号,让其他程序员阅读您的代码,并使用您的函数。对于“其他程序员”,我也会在几周、几个月或几年后介绍您,那时您可能会回到代码中,忘记了代码的细节。

使用
const
可以防止您或其他使用代码的人意外出错。此外,出于文档目的,因为代码的读者知道这些函数不会更改指针指向的字符(只读)

此外,如果使用
const
correctification,编译器可能会优化代码,因为它知道这些值在只读函数中不会发生更改。但记录并使功能更安全的第一个原因更重要

您经常会遇到三种形式:
char*s1
const char*s1
const char*const s1
。第四种但很少需要的形式是:
char*const
。含义如下:

1。
char*s1

在这种情况下,
s1
只是指向一个或多个字符的内存的指针。 在功能内部可以/不能执行以下操作:

/* Function might changes content of s1 */
int TEST (char* s1)
{
   s1[0] = 'A'; /* works */
   *s1 = 'A';   /* same as above works */
   ++s1;        /* this works because the copy of the pointer is non constant */
   ...
}
/* Function is read-only and doesn't changes content of s1 */
int CONST_TEST (const char* s1)
{
   s1[0] = 'A'; /* compiler fail */
   *s1 = 'A';   /* same as above compiler fail */
   ++s1;        /* this works because the copy of the pointer is non constant */
   ...
}
可以/无法拨打以下电话:

char*       str;
const char* const_str;
...
TEST(str);       /* works as str as no restrictions */
TEST(const_str); /* fails because function might change const const_str */
char*       str;
const char* const_str;
...
CONST_TEST(str);       /* works as str as no restrictions */
CONST_TEST(const_str); /* works because function is read-only and const_str is it also */

2。
常量字符*s1

术语:
const char*s1
表示
s1
是指向一个或多个字符的内存的指针,不能用该指针更改。在功能内部可以/不能执行以下操作:

/* Function might changes content of s1 */
int TEST (char* s1)
{
   s1[0] = 'A'; /* works */
   *s1 = 'A';   /* same as above works */
   ++s1;        /* this works because the copy of the pointer is non constant */
   ...
}
/* Function is read-only and doesn't changes content of s1 */
int CONST_TEST (const char* s1)
{
   s1[0] = 'A'; /* compiler fail */
   *s1 = 'A';   /* same as above compiler fail */
   ++s1;        /* this works because the copy of the pointer is non constant */
   ...
}
可以/无法拨打以下电话:

char*       str;
const char* const_str;
...
TEST(str);       /* works as str as no restrictions */
TEST(const_str); /* fails because function might change const const_str */
char*       str;
const char* const_str;
...
CONST_TEST(str);       /* works as str as no restrictions */
CONST_TEST(const_str); /* works because function is read-only and const_str is it also */
编译器将无法编译,并告诉您尝试写入标记为常量的内存位置


3。
常量字符*常量s1

这意味着:
s1
是指向一个或多个字符的内存的常量指针,不能用该指针更改。这是对第一种方法的扩展,指针
s1
本身通过值传递,此副本不能在函数内部更改。因此,您可以在函数中执行类似于
++s1
的操作,因此指针将始终指向相同的内存位置


4。
char*const s1


这与案例3类似,但没有指向标记为常量的内存的
s1
。因此,
s1
所指向的内容可以像案例1一样更改,但指针保持不变。

使用
const
可以防止您或使用代码的其他人意外出错。此外,出于文档目的,因为代码的读者知道这些函数不会更改指针指向的字符(只读)

进一步