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
可以防止您或使用代码的其他人意外出错。此外,出于文档目的,因为代码的读者知道这些函数不会更改指针指向的字符(只读)
进一步