Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
char*p=";“奥库特”;vs const char*p=";“奥库特”;_C_Pointers - Fatal编程技术网

char*p=";“奥库特”;vs const char*p=";“奥库特”;

char*p=";“奥库特”;vs const char*p=";“奥库特”;,c,pointers,C,Pointers,这两个有什么区别 编辑 来自bjarne stroustrup,第三版第90页 char *p="orkut" vs const char *p="orkut" 只有在运行时和实现对该规则的执行不同之前,才能捕获此类错误 与const char*p=“柏拉图”相同 这就是为什么我要问区别。。。const在这里的意义是什么?变量const char*是正确的 您不应该更改来自字符串文本的内存(通常称为静态存储)。它是只读存储器 不同之处在于char*变量将允许您编写语法,通过取消引用来更改它所

这两个有什么区别

编辑

来自bjarne stroustrup,第三版第90页

 char *p="orkut" vs const char *p="orkut"
只有在运行时和实现对该规则的执行不同之前,才能捕获此类错误

与const char*p=“柏拉图”相同


这就是为什么我要问区别。。。const在这里的意义是什么?

变量
const char*
是正确的

您不应该更改来自字符串文本的内存(通常称为静态存储)。它是只读存储器

不同之处在于
char*
变量将允许您编写语法,通过取消引用来更改它所指向的数据。但它的实际功能尚未定义

void f()
{

char* p="plato";
p[4]='e' // error: assign to const;result is undefined

}

我宁愿选择2发生在我身上

const char*变量是正确的

您不应该更改来自字符串文本的内存(通常称为静态存储)。它是只读存储器

不同之处在于
char*
变量将允许您编写语法,通过取消引用来更改它所指向的数据。但它的实际功能尚未定义

void f()
{

char* p="plato";
p[4]='e' // error: assign to const;result is undefined

}

我宁愿选择2发生在我身上

const char*p的声明意味着p指向的东西是const,即不应该改变。我说不应该,因为这是可以摆脱的康斯坦斯。如前所述,更改字符串文字是未定义的,通常会导致访问冲突/分段错误


不是这个声明不同于char*const p,这意味着p本身是const,而不是p指向的东西。

const char*p的声明意味着p指向的东西是const,即不应该改变。我说不应该,因为这是可以摆脱的康斯坦斯。如前所述,更改字符串文字是未定义的,通常会导致访问冲突/分段错误


此声明不同于char * const p,这意味着p本身是const而不是p p指向.< /p> < p> Stroustrup所讨论的问题是,在C++中,字符串文字将很容易转换成“类型的指针”,以“char”(4.2/2)数组到指针转换“”这是特别的,所以将一个代码> char */COD>指向文字字符串的非常常见的习惯用法不会导致BZILLILIN程序编译失败(尤其是当C++最初从C中进化)时。


如果您可以将指针声明为
char-const*
(或等效的
const-char*
)你可以帮助自己避免像StroutruUp引文中所描述的问题。但是,使用函数不等于100%的指针,你可能会遇到恼人的问题。

< P> Stroustrup在引用的问题中讨论的问题是,C++中的字符串文字很容易转换为““指针到字符”(4.2/2“数组到指针转换”)类型的rvlaue。这是为了让非常常见的将
char*
指向文本字符串的习惯用法不会导致大量程序无法编译。(特别是当C++最初从C演化)时,

如果您可以将指针声明为
char-const*
(或等效的
const-char*
),您将避免遇到Stroustrup引号中描述的问题。但是,如果指针的函数不是100%常量正确,则很可能会遇到令人恼火的问题。

请参阅

基本上

//Option 1:
char *p = "orkut";
*p = 'x';//undefined behavior


//Option 2:
const char *q = "orkut";
*q = 'x';//compiling error
在这种情况下,
p
应该是只读的,但这并不是所有编译器(或标准)都强制执行的。

请参阅

基本上

//Option 1:
char *p = "orkut";
*p = 'x';//undefined behavior


//Option 2:
const char *q = "orkut";
*q = 'x';//compiling error

在这种情况下,
p
应该是只读的,但这并不是所有编译器(或标准)都强制执行的。

请注意,最近的gcc实现不允许您这样做

char *p="orkut";

他们坚持使用const(当然是在-wall-werror模式下)

注意,最近的gcc实现不允许您这样做

char *p="orkut";

他们坚持使用const(当然是在-wall-werror模式下)

const makes for invoioled'variables'这可能会有帮助,const makes for invoioled'variables'这可能会有帮助,并非所有编译器都需要它,但静态数据很可能以只读页/段结束。因此,即使在编译器允许的情况下,这也可能导致运行时出现错误行为(崩溃)。但是,问题是,“这两者之间有什么区别”,而不是“哪一个是正确的?”:)不完全正确。
char*
变量将(更容易)允许未定义的行为。它是否真正允许您更改数据尚未定义。字符串文字是否实际位于只读内存中也未定义。两者都是“正确的”,因为它们都是语言允许的,并且必须被编译器接受。@Charles:我澄清了我的意思是它允许您编写语法来做。。。。但澄清了这可能与实际行为不符。我认为现在的答案似乎更加一致;以前似乎有点矛盾,不是所有的编译器都需要这样,但是静态数据最终可能会变成只读页/段。因此,即使在编译器允许的情况下,这也可能导致运行时出现错误行为(崩溃)。但是,问题是,“这两者之间有什么区别”,而不是“哪一个是正确的?”:)不完全正确。
char*
变量将(更容易)允许未定义的行为。它是否真正允许您更改数据尚未定义。字符串文字是否实际位于只读内存中也未定义。两者都是“正确的”,因为它们都是语言允许的,并且必须被编译器接受。@Charles:我澄清了我的意思是它允许您编写语法来做。。。。但澄清了这可能与实际行为不符