您现在的位置是:首页 > 文章详情

《C和C++代码精粹》——2.6 const指针

日期:2017-05-01点击:433

本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第2章,第2.6节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.6 const指针

C和C++代码精粹
注意memcpy函数第二个参数中的const关键字。这个关键字告诉编译器此函数将不会改变source指向的任何值(除了强制类型转换)。当把指针作为参数传递时,总是合适地使用const限定符是一个很好的习惯,它不仅可以防止你无意中错误的赋值,而且还可以防止在作为参数将指针传递给函数时可能会修改了本不想改变的指针所指向的对象的值。例如,如果在程序清单2.6中的声明是:

const int i=7,j=8; 

有可能因为下面这条语句而得到警告:

swap(&i,&j); 

因为swap的确改变了其参数所指的变量的值。

如果浏览一下你所使用的编译器提供的标准头文件,就会看到const。在一个声明中,当const出现在星号前面的任意位置时,表明所指向的内容不会被改变:

const char *p; //指向常字符的指针 char const *q; //同样是指向常字符的指针 char c; c=*p; //OK(假设p和q已经初始化了) *q=c; //错误,不能改变指针所指的内容 

也可以通过把const放在星号的后面来声明指针本身不可改变:

char* const p; *p='a'; //OK,只有指针是常量 ++p; //错误,不能改变指针 

要禁止改变指针和它所引用的内容,就在星号前和后都使用const:

const char* const p; char c; c=*p; //OK-能读出内容 *p='a'; //错误 ++p; //错误 

程序清单 2.7中的函数inspect说明了如何打印出任何对象的不同字节。因为我并没有改变对象的内容,所以第一个参数是一个指向const的指针,而且,在使用它之前要小心地将它转换成一个指向常字符的指针。

程序清单2.7 检查任何对象的函数

// inspect.cpp: 检查对象的字节 #include <iostream> #include <iomanip> using namespace std; void inspect(const void* ptr, size_t nbytes) { const unsigned char* p = (const unsigned char*) ptr; cout.setf(ios::hex, ios::basefield); for (int i = 0; i < nbytes; ++i) cout << "byte " << setw(2) << setfill(' ') << I << ": " << setw(2) << setfill('0') << int(p[i]) << endl; } main() { char c = 'a'; short i = 100; long n = 100000L; double pi = 3.141529; char s[] = "hello"; inspect(&c, sizeof c); cout << endl; inspect(&i, sizeof i); cout << endl; inspect(&n, sizeof n); cout << endl; inspect(&pi, sizeof pi); cout << endl; inspect(s, sizeof s); cout << endl; } //输出: byte 0: 61 byte 0: 64 byte 1: 00 byte 0: a0 byte 1: 86 byte 2: 01 byte 3: 00 byte 0: 13 byte 1: 7c byte 2: d3 byte 3: f4 byte 4: d9 byte 5: 21 byte 6: 09 byte 7: 40 byte 0: 68 byte 1: 65 byte 2: 6c byte 3: 6c byte 4: 6f byte 5: 00 

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

原文链接:https://yq.aliyun.com/articles/94350
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章