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

简介:

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

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

相关文章
|
23天前
|
自然语言处理 算法 前端开发
C++与Doxygen:精通代码文档化之道
C++与Doxygen:精通代码文档化之道
48 0
|
25天前
|
JSON JavaScript 前端开发
C++ 智能指针与 JSON 处理:高级编程技巧与常见问题解析
C++ 智能指针与 JSON 处理:高级编程技巧与常见问题解析
255 0
|
24天前
|
Linux 编译器 程序员
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
65 0
|
3天前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
|
9天前
|
编译器 C++
|
11天前
|
存储 C++
C++指针
C++指针
|
17天前
|
C语言 C++ 容器
C调用C++代码
C调用C++代码
12 1
|
22天前
|
存储 编译器 C语言
【c++】类和对象(二)this指针
朋友们大家好,本节内容来到类和对象第二篇,本篇文章会带领大家了解this指针
【c++】类和对象(二)this指针
|
23天前
|
存储 编译器 C语言
【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)
【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)
|
23天前
|
算法 程序员 C语言
C++设计哲学:构建高效和灵活代码的艺术
C++设计哲学:构建高效和灵活代码的艺术
60 1

热门文章

最新文章