C语言 const和指针

C语言 const和指针关键字 const 用来定义常量 如果一个变量被 const 修饰 那么它的值就不能再被改变 1 修饰变量 constinta 5 intconsta 5 上面这两种写法都一样 都是表示变量 n 的值不能被改变了 需要注意的地方是 用 const 修饰变量时 一定要给变量初始化 否则之后就不能再进行赋值了 例如下面这个例子 constinta a 5

关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。

1. 修饰变量
const int a = 5; int const a = 5; 

上面这两种写法都一样,都是表示变量n的值不能被改变了。需要注意的地方是,用const修饰变量时,一定要给变量初始化,否则之后就不能再进行赋值了。例如下面这个例子:

const int a; a = 5; /*错误,无法再赋值*/
2. const用于修饰常量静态字符串
const char* str="aabbcc";

如果没有const的修饰,我们可能会在后面有意无意的写str[4]='z';这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处,让逻辑错误在编译期被发现。

3. 常量指针

常量指针是指针指向的内容是常量,可以有以下两种定义方式。

const int * p; int const * p;
  • 常量指针说的是不能通过这个指针改变变量的值,但是可以通过其他的引用来改变变量的值。
int const *p; int a = 4; p = &a; *p = 5;/*错误,不能通过指针p来改变值*/ a = 5;/*正确,*p这时候也等于5*/
  • 常量指针指向的值不能改变,但是这并不意味着指针本身不能改变,常量指针可以指向其他的地址。
int a = 4; int b = 5; const int *p; p = &a; p = &b;
4. 指针常量

指针常量是指 指针本身是个常量,不能再指向其他的地址,写法如下:

 int *const p;

指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改。

int a = 4; int b = 5; int *const p = &a;/*要马上初始化,之后无法赋值*/ p = &b;/*错误,无法赋值*/ *p = b;/*正确*/

区分常量指针和指针常量的关键就在于星号*的位置,我们以星号为分界线。如果const在星号的左边,则为常量指针,如果const在星号的右边则为指针常量。如果我们将星号读作‘指针’,将const读作‘常量’的话,内容正好符合。int const * n;是常量指针,int *const n;是指针常量。

5. 指向常量的常指针

指向常量的常指针是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的普通指针改变变量的值。

const int *const p;
6. 修饰函数参数
  • 防止修改指针指向的内容
void StringCopy(char *strDestination, const char *strSource);

其中strSource是输入参数,strDestination是输出参数。给strSource加上const修饰后,如果函数体内的语句试图改动strSource的内容,编译器将指出错误。

  • 防止修改指针指向的地址
void swap ( int * const p1 , int * const p2 );

指针p1和指针p2指向的地址都不能修改。

7. 修饰函数返回值

如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
例如函数

const char * GetString(void);

如下语句将出现编译错误:

char *str = GetString();

正确的用法是

const char *str = GetString();
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211070.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午11:16
下一篇 2026年3月18日 下午11:16


相关推荐

  • 如何在Chrome下使用Postman进行rest请求测试

    如何在Chrome下使用Postman进行rest请求测试

    2021年10月12日
    38
  • 2019 Python接口自动化测试框架实战开发(一)

    2019 Python接口自动化测试框架实战开发(一)说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!目录一丶叙述二丶接口基础知识三丶接口测试工具四丶Fiddler的使用五丶unittest使用六丶mock服务入门到实战七丶接口自动化框架设计到开发一丶叙述1.项目介绍整个项目分为四个部分:接口基础丶接口开发丶Unittest与接口测试结合以及接口自动化框架从设计到开发接口基础包括:H…

    2022年4月30日
    38
  • nick nack_coughing翻译

    nick nack_coughing翻译webrtc中fec的处理机制:获取一帧数据,拆分成多个rtp包,再封装成fec包(fec只有primayblock),发送到网络;之后根据rtp包生成相应数量的fec包(根据冗余度来生成对应数量的包),再发送到网络。需要注意的是:rtpred包和fecred包都是序号连续的。所以判断一个完整帧的依据依然可以使用:获取到首包,获取到尾包,中间包连续。但因为fec的加入,导致所有原始数据的rtp包无法连续(和纯nack不会这样)。所以针对带有fec包的丢包处理机制是这样的:如果一个完整帧里面丢了原始

    2022年8月11日
    6
  • 数据结构b-树和b+树_A票领导B票算法

    数据结构b-树和b+树_A票领导B票算法一、什么是多路查找树二叉树有诸多便利之处,但是当二叉树节点极多时,二叉树的构建速度就会受影响,而且过高的层数也会导致对树的操作效率降低。对于树的查找而言,树的高度决定了查找的时间下限,但是同样数量

    2022年8月16日
    8
  • 向量投影的性质

    向量投影的性质向量 aaa 在向量 uuu 上的投影记为 Prju a Prju a Prj overrightarr overrightarr 向量投影的性质 Prju a a cos Prju a a cos Prj overrightarr overrightarr overrightarr cos phi 其中 phi 为 a

    2026年3月18日
    2
  • rootfs.bin_libhdfs

    rootfs.bin_libhdfs忘了到底前几年看的一篇什么busybox的教程,写的及其复杂,以至于让我这么久以来一直不敢再去碰这个东西,直到今天又再次有了这个需求,特来再搞一次,没想到不到俩小时,一次搞定,特将这过程记录下来,以后也好有个参考。1环境宿主机:Ubuntu18.04交叉编译工具链:aarch64-linux-gnu-gcc7.4.0目标机:Armv8i.MX8EVKboard2下载…

    2022年10月7日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号