IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C和指针学习笔记(一)——const常量 -> 正文阅读

[C++知识库]C和指针学习笔记(一)——const常量

这个系列主要是我学习《C和指针》这本书的一些笔记,主要关于一些小的细节,目的是供自己学习和参考,详细地部分建议大家可以阅读一些《C和指针》这本书

一般情况

我们在编程的过程中,可能会遇到一种量,它的值不会被改变,或者说我们不希望在之后的代码执行过程中改变这个值。C 中通过引入 const 修饰符来表示这种量,即常量。如果在代码的执行过程中修改了常量,那么编译器就会报错(暂且算是一种对数据自动的保护机制吧)。
例如

const int N = 100; //定义一个值为100的常量

和指针联用

一般情况非常容易理解,但 const 修饰符也可以和指针联用来达到一些目的,会有以下三种情况

const int * point1;
int const * point2;
int * const point3;

前面两种情况即 point1point2 都表示指针指向的数据是只读的,但指针本身是可以更改的(改变其指向的地址)
最后一种情况,即 point3 表示指针本身是只读的(不可以改变其指向的地址),但指针指向的数据的值是可以改变的。
一个具体的栗子

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int b = 100;
    int c = 100;
    const int a = 100;
    const int * point1;
    int const * point2;
    int * const point3 = &b;
    *point3 = 101;
    point1 = &a;
    // *point1 = 101; // 报错
    b = 101;
    // point3 = &c; // 报错
    int * const point4 = &a; // 如果指向一个常量那么可以通过指针修改这个常量
    *point4 = 101;
    printf("%d\n", *point4); // 输出 101
    printf("%d\n", a); //输出 101
    return 0;
}


还可以用两个 const 表示一个指向常量的只读指针。

const int * const point5;
int const * const point6;

const和函数形参

const 通常用在函数形参中,如果形参是一个指针,为了防止在指针内部修改指针指向的数据,就可以用 const 来限制
例如C语言标准库,有很多参数的形参被const限制

size_t strlen ( const char * str );
int strcmp ( const char * str1, const char * str2 );
char * strcat ( char * destination, const char * source );
char * strcpy ( char * destination, const char * source );

自己也可以使用 const 来限制形参。
一个具体的栗子

#include <stdio.h>
#include <stdlib.h>

int output(const int * a)
{
    // *a = 101; // 报错
    printf("%d\n", *a); // 输出 100
}
int main()
{
    int b = 100;
    output(&b);
    return 0;
}


const 和 非const 类型转换

当一个指针变量 point1const 限制时,并且类似 const int *point1 这种形式,说明指针指向的数据不能被修改;如果将 point1 赋值给另外一个未被 const 修饰的指针变量 point2,就有可能发生危险。因为通过 point1 不能修改数据,而赋值后通过 point2 能够修改数据了,意义发生了转变,所以编译器不提倡这种行为,会给出错误或警告 (实测有的编译器并不会给出警报和错误,并且能正常运行,比如CB)。
也就是说,const int *int * 是不同的类型,不能将 const int * 类型的数据赋值给 int * 类型的变量。但反过来是可以的,编译器允许将 int * 类型的数据赋值给 const int * 类型的变量。
这种限制很容易理解,int * 指向的数据有读取和写入权限,而 const int * 指向的数据只有读取权限,降低数据的权限不会带来任何问题,但提升数据的权限就有可能发生危险。
C语言标准库中很多函数的参数都被 const 限制了,但我们在以前的编码过程中并没有注意这个问题,经常将非 const 类型的数据传递给 const 类型的形参,这样做从未引发任何副作用,原因就是上面讲到的,将非 const 类型转换为 const 类型是允许的。


下面是一个将 const 类型赋值给非 const 类型的例子:

#include <stdio.h>
#include <stdlib.h>

void output(int * point2)
{
    *point2 = 101;
    printf("%d\n", *point2); //输出101
}
int main()
{
    const int b = 100;
    const int * point1 = &b;
    output(point1);
    printf("%d\n", b); //输出101
    return 0;
}


参考博客
C语言const的用法详解,C语言常量定义详解

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-07 13:40:26  更:2021-10-07 13:42:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 0:56:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码