2015-07-05 66 views
0

为什么const char*指向的值由char数组更新,该数组应该只保存应存储在ROM中的原始字符串文本的副本。const char *仍然修改指向的值

我知道const char*char* constconst char* const的基本理论从这个链接const char * const versus const char *?

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 

    char a[] = "ABCD"; 
    char z[] = "WXYZ"; 
    const char* b = a; 
    a[1] = 'N'; // WHY THIS WORKS AND UPDATES THE VALUE IN B.... a should make its own copy of ABCD and update 
       // it to NBCD... b should still point to a read only memory ABCD which can't be changed4 

    //b[1] = 'N'; // THIS FAILS AS DESIRED 
    printf("%s\n", b); // Output -> ANCD 

    return 0; 
} 
+2

程序中没有数组的副本。赋值不会复制数组。 –

回答

4
const char* b = a; 

const这里意味着你不能修改什么指针指向通过b,仅此而已。通过a修改内容仍然是合法的。

1

你错过了解什么是简单的指针。当你写

const char* b = a; 

它说变量b指向变量a的相同的内存位置。所以无论你在a中所做的改变都会反映在b所指的记忆中。

0

您使b指向const,因此您无法使用b[...]修改b指向的值。但是,您并没有将a设为常量指针,您可以修改a[]的内容。

变量b保留您分配的内容。并且您分配了一个指向a数组的第一项的指针。现在b指向存储a[0]的相同内存位置。修改a数组内容后,您会看到b指向同一位置,现在包含已修改的数据。

0

C只禁止修改用const说明符定义的对象。您的对象a未使用该说明符定义,因此可以进行修改。

虽然确实无法通过b进行修改,但可以通过其他方式进行修改(如a)。