《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

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

相关文章
|
16天前
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
59 0
|
16天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
50 0
|
2月前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
62 4
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
140 4
|
3月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
3月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
3月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
3月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
3月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
73 1
|
3月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
54 2