本文共 1989 字,大约阅读时间需要 6 分钟。
本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第2章,第2.6节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。
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#include 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: 61byte 0: 64byte 1: 00byte 0: a0byte 1: 86byte 2: 01byte 3: 00byte 0: 13byte 1: 7cbyte 2: d3byte 3: f4byte 4: d9byte 5: 21byte 6: 09byte 7: 40byte 0: 68byte 1: 65byte 2: 6cbyte 3: 6cbyte 4: 6fbyte 5: 00
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。