《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

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

相关文章
|
3月前
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
417 94
|
5月前
|
缓存 安全 编译器
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
《C++面试冲刺周刊》第三期聚焦指针与引用的区别,从青铜到王者级别面试回答解析,助你21天系统备战,直击高频考点,提升实战能力,轻松应对大厂C++面试。
524 132
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
|
4月前
|
C++ Windows
应用程序无法正常启动(0xc0000005)?C++报错0xC0000005如何解决?使命召唤17频频出现闪退,错误代码0xC0000005(0x0)
简介: 本文介绍了Windows应用程序出现错误代码0xc0000005的解决方法,该错误多由C++运行库配置不一致或内存访问越界引起。提供包括统一运行库配置、调试排查及安装Visual C++运行库等解决方案,并附有修复工具下载链接。
1445 1
|
5月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
528 12
|
11月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
|
6月前
|
API 数据安全/隐私保护 C++
永久修改机器码工具, exe一机一码破解工具,软件机器码一键修改工具【c++代码】
程序实现了完整的机器码修改功能,包含进程查找、内存扫描、模式匹配和修改操作。代码使用
|
7月前
|
C++
爱心代码 C++
这段C++代码使用EasyX图形库生成动态爱心图案。程序通过数学公式绘制爱心形状,并以帧动画形式呈现渐变效果。运行时需安装EasyX库,教程链接:http://【EasyX图形库的安装和使用】https://www.bilibili.com/video/BV1Xv4y1p7z1。代码中定义了屏幕尺寸、颜色数组等参数,利用随机数与数学函数生成动态点位,模拟爱心扩散与收缩动画,最终实现流畅的视觉效果。
1018 0
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
297 4