Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

C语言关键字const再理解

$
0
0

        以往对C语言关键字const的理解是一个const类型的常量指针被赋值为某一块内存区域的首地址时,这块内存区域中的数据不可修改。

        如代码const char* string = “abcdefg",此时常量指针string指向一块内存区域,其中数据为"abcdefg",其中的数据不可修改。

        但是若遇到以下代码:

         char             string[]      =  {"abcdefg"};

         char*           dst             =  string;

         const char* src            =  string + 2 * sizeof(char);

         int                 len             =  3 * sizeof(char);

         memmove(dst,  src, len);

         上面代码的运行结果就不说了,其与上面的看法相冲突的就是常量指针src指向的内存区域的数据一定会是被修改了。

         无解吗?非也。

         首行的那种看法本身就是错误的。上面常量指针src指向的是一块栈内存,当然是可以被修改的。

         正确的看法是?

         无论常量指针指向何种类型的内存区域,不借助强力手段(指针类型转换去除const)我们是无法通过这个指针来修改它指向的内存区域的数据。换句话说,如果有常量指针cptr和非常量指针ptr指向同一块栈内存区域data,我们不能通过常量指针cptr修改data中的数据,但我们可以通过ptr修改data中的数据。当然,如果data是常量内存区域,则都不可以借助它们修改data中的数据。

         上面的文字可能拗口,有如下代码示例。如:

         char               string[]                   =  {"abcdefg"};

         char*             string_ptr              = string;

          const char* const_string_ptr  = string;

         针对上面代码,若有赋值语句string_ptr[0]  = ‘h';  则是正确的,即可以通过非常量指针string_ptr修改string中的数据。

         但是,如果有代码const_string_ptr[0] = 'h'; ,则gcc会给出错误提示"error: assignment of read-only location 'const_string_ptr'"。

         完毕。此记。 

    

           

        

作者:menggucaoyuan 发表于2013-5-3 20:08:56 原文链接
阅读:4 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>