博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《C和C++代码精粹》——2.6 const指针
阅读量:6203 次
发布时间:2019-06-21

本文共 1989 字,大约阅读时间需要 6 分钟。

本节书摘来自异步社区出版社《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 
#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

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

你可能感兴趣的文章
百度推送老是不成功,没有提醒查找原因
查看>>
JSON
查看>>
仿美团实现地域选择和城市列表
查看>>
fastlane use_legacy_build_api true
查看>>
Git 学习笔记之 merge
查看>>
ajax跨域
查看>>
【三角函数】已知直角三角形的斜边长度和一个锐角角度,求另外两条直角边的长度...
查看>>
iOS端(腾讯Bugly)闪退异常上报扑获日志集成与使用指南
查看>>
在Markdown中输入数学公式
查看>>
萌新一手包App前后端开发日记(一)
查看>>
经典问题之「分支预测」
查看>>
好程序员web前端分享MVVM框架Vue实现原理
查看>>
Github入门详情教程
查看>>
Java之Set集合的"怪"
查看>>
快速入门Pytorch(1)--安装、张量以及梯度
查看>>
Hook技术之Hook Activity
查看>>
【国际专场】laravel多用户平台(SaaS, 如淘宝多用户商城)的搭建策略
查看>>
restTemplate使用和踩坑总结
查看>>
Laravel 5 4 实现前后台登录
查看>>
Volley 源码解析之网络请求
查看>>