const char *仍然修改指向的值

时间:2015-07-05 08:40:39

标签: c char const

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

我从此链接const char * const versus const char *?

了解const char*char* constconst char* const的基本理论
#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;
}

4 个答案:

答案 0 :(得分:4)

class DenseTransformer(TransformerMixin):
    def transform(self, X, y=None, **fit_params):
        return X.todense()

    def fit_transform(self, X, y=None, **fit_params):
        self.fit(X, y, **fit_params)
        return self.transform(X)

    def fit(self, X, y=None, **fit_params):
        return self

classifier = Pipeline([
('vectorizer', CountVectorizer ()),
('TFIDF', TfidfTransformer ()),
('to_dense', DenseTransformer()), 
('clf', OneVsRestClassifier (GaussianNB()))])
classifier.fit(X_train,Y)
predicted = classifier.predict(X_test)

const char* b = a; 这意味着您无法修改指针指向const的内容,而不是b。通过a修改内容仍然合法。

答案 1 :(得分:1)

您需要了解的是什么是简单的指针。当你写

echo

它表示变量b指向变量a的相同内存位置。因此,无论你在一个意志中做出什么改变都会反映在b所指出的记忆中。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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