C语言 const 修饰函数参数 - C语言零基础入门教程
C语言 const 修饰函数参数 - C语言零基础入门教程
目录
- 一.const 简介
- 1.const 修饰变量
- 2.const 修饰指针
- 3.const 修饰在函数名前面
- 4.const 修饰在函数名后面
- 二.const 修饰函数参数
- 1.值传递
- 2.址传递
- 3.const 修饰函数参数
- 三.猜你喜欢
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
一.const 简介
const 是 constant 的缩写,“恒定不变”的意思。被 const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多 C++ 程序设计书籍建议:“Use const whenever you need”。
1.const 修饰变量
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 const 修饰函数参数
//@Time:2021/07/04 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/#include int main() {const int a = 20 ;printf("a = %d\n",a);a = 200 ;printf("a = %d\n",a);return 0;
}/*输出:Compilation Failederror: assignment of read-only variable 'a'6 | a = 200 ;| ~~^~~~~*/
用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。并且 const 修饰的变量在定义的时候就给它赋初值,否则报错:
error: uninitialized 'const ' [-fpermissive]
详细解释可以直接跳转:const 修饰变量;
2.const 修饰指针
//以下两者等价,表示 *p 不可变。*p 表示的是指针变量 p 所指向的内存单元里面的内容,此时这个内容不可变;
const int *p
int const *p//此时 const 修饰的是 p,所以 p 中存放的内存单元的地址不可变,而内存单元中的内容可变。即 p 的指向不可变,p 所指向的内存单元的内容可变;
int * const p//*p 和 p 都被修饰了,那么 p 中存放的内存单元的地址和内存单元中的内容都不可变;
const int * const p
详细解释可以直接跳转:const 修饰指针;
3.const 修饰在函数名前面
当 const 在函数名前面的时候修饰的是函数返回值;在函数名后面表示是 C++ 常成员函数,该函数不能修改对象内的任何成员,只能发生读操作,不能发生写操作。
const char * GetString(void);
const int GetInt(void);
const float GetFloat(void);
const double GetDdouble(void);
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加 const 修饰的同类型指针;
const char * GetString(void);//如下语句将出现编译错误:
//char *str = GetString();//正确的用法是
const char *str = GetString();
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加 const 修饰没有任何价值。
int GetInt(void);const int GetInt(void);
以上两个函数都是都是独立存在的,并非同一个函数;
4.const 修饰在函数名后面
当 const 在函数名前面的时候修饰的是函数返回值;在函数名后面表示是 C++ 常成员函数,该函数不能修改对象内的任何成员,只能发生读操作,不能发生写操作。
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 const 修饰函数参数
//@Time:2021/07/04 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/class People
{public:int talk(void);int eat(void) const; // const 成员函数private:int m_age;};
int People::eat(void) const
{++m_age; // 编译错误,企图修改数据成员m_numtalk(); // 编译错误,企图调用非const函数return m_age;
}
- const 对象只能访问 const 成员函数,而非 const 对象可以访问任意的成员函数,包括 const 成员函数;
- const 对象的成员是不可修改的,然而 const 对象通过指针维护的对象却是可以修改的;
- const 成员函数不可以修改对象的数据,不管对象是否具有 const 性质.它在编译时,以是否修改成员数据为依据,进行检查;
- 然而加上 mutable 修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的 const 成员函数是可以修改它的;
二.const 修饰函数参数
关于函数参数值传递和址传递:
- 值传递:实参是传递的值,并非地址,形参的值发生改变,实参不受影响;
- 址传递:实参是传递的地址,并非值,形参的值发生改变,实参会跟着一起改变(因为实参和形参都是指向同一块内存地址);
1.值传递
值传递一般作为输入参数,实参是传递的值,并非地址,形参的值发生改变,实参不受影响;
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 const 修饰函数参数
//@Time:2021/07/04 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/#include
void func(int x, int y)
{x = 100;y = 200;printf("func:x = %d, y = %d\n", x, y);
}
int main(void)
{int a=10;int b=20;/*变量a、b为func函数的实际参数*/func(a, b);printf("main:a = %d, b = %d\n", a, b);return 0;
}
/*
输出:
func:x = 100, y = 200
main:x = 10, y = 20
*/
2.址传递
址传递:使用指针变量或者内存地址作为函数参数,在调用结束后,实参跟随形参一起变化(可以作为输入参数也可以作为输出参数)。举个例子:
/**************************************************************/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 const 修饰函数参数
//@Time:2021/07/04 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/#include
void func(int *x, int *y)
{*x = 100;*y = 200;printf("func:x = %d, y = %d\n", x, y);
}
int main(void)
{int a=10;int b=20;/*分别对变量a、b取地址,并作为func函数的实际参数*/func(&a, &b);printf("main:a = %d, b = %d\n", a, b);return 0;
}
/*
输出:
func:x = 100, y = 200
main:x = 100, y = 200
*/
3.const 修饰函数参数
如果函数参数采用“指针传递”,那么加 const 修饰可以防止意外地改动该指针,起到保护作用。
void StringCopy (char*strDestination, const char *strSource);
其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误。
如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加 const 修饰。
例如不要将函数 void Func1(int x) 写成 void Func1(const int x)。
如果参数作为输出参数,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加 const 修饰,否则该参数将失去输出功能(因为有 const 修饰之后,不能改变他的值)。
如果参数作为输入参数,可以防止数据被改变,起到保护作用,增加程序的健壮性;
三.猜你喜欢
- C 语言 数组下标越界和内存溢出区别
- C 语言 指针声明和定义
- C 语言 指针 p++ / p–
- C 语言 p++/§++/_(p++)/_p++
- C 语言 使用指针遍历数组
- C 语言 指针和数组区别
- C 语言 指针数组和数组指针区别
- C 语言 空指针 NULL
- C 语言 void 指针
- C 语言 野指针
- C 语言 函数值传递和址传递
- C 语言 函数缺省参数
- C 语言 函数不定长参数
- C 语言 函数指针
- C 语言 指针函数
- C 语言 回调函数 callback
- C 语言 typedef
- C 语言 define 定义常量
- C 语言 define 防止头文件重复包含
- C 语言 #pragma once
- C 语言 #include <> 与 #include “” 区别
- C 语言 const 修饰变量
- C 语言 const 修饰指针
- C语言 const 修饰函数
- C 语言 const 修饰函数参数
www.bdsoba.com www.awaedu.com www.sobd.cc
C语言 const 修饰函数参数 - C语言零基础入门教程相关推荐
- Python eval 与 exec 函数的区别 - Python零基础入门教程
目录 一.Python eval 与 exec 函数的区别 二.价值 10 个亿的智能机器人核心代码 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Py ...
- C语言 main 函数参数 main(int argc, char *argv[]) - C语言零基础入门教程
目录 一.main 函数写法 二.main 函数参数简介 三.使用 main 函数参数 1.打印 main 函数参数 a.直接运行 exe 文件 b.打开 cmd 命令行窗口执行 exe 文件 c.打 ...
- C语言 函数不定长参数 ##__VA_ARGS__经典案例 - C语言零基础入门教程
目录 一.##__VA_ARGS__简介 二.##__VA_ARGS__经典案例 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.## ...
- C/C++ _wcsupr_s 函数 – unicode 字符串小写转大写 - C语言零基础入门教程
目录 一._wcsupr_s 函数简介 二._wcsupr_s 函数实战 三.注意问题 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 零 ...
- C/C++ _wcslwr_s 函数 – unicode 字符串大写转小写 - C语言零基础入门教程
目录 一._wcslwr_s 函数简介 二._wcslwr_s 函数实战 三.注意问题 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 零 ...
- C/C++ _strupr_s 函数 – 字符串小写转大写 - C语言零基础入门教程
目录 一._strupr_s 函数简介 二._strupr_s 函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 零基础 C/C+ ...
- C/C++ _strlwr_s 函数 – 字符串大写转小写- C语言零基础入门教程
目录 一._strlwr_s 函数简介 二._strlwr_s 函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 零基础 C/C+ ...
- C/C++ atol函数- C语言零基础入门教程
目录 一.ltoa 函数简介 二.int/long/unsigned long 区别 1.无符号整形(16 位系统) 2.有符号整形(16 位系统) 3.int 和 long 区别 三.atol 函数 ...
- C/C++ strtol 函数 - C语言零基础入门教程
目录 一.strtol 函数简介 二.strtol 函数函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.strtol 函数简 ...
最新文章
- XXX语录,可以不信,但不能不看
- php入门05-会话控制(session与cookie)
- [html] Standards模式和Quirks模式有什么区别?
- 监控linux内存,linux 监控系统资源-内存
- 堆栈关系java_从关键字说Java对象、引用、指针、堆栈的关系
- 将对象绑定到WinForm中的combobox时出现的奇怪错误:组合框的下拉项太多!
- Kafka从上手到实践 - Kafka CLI:Reseting Offset Config CLI | 凌云时刻
- 宾州州立大学计算机本科,2020年宾州州立大学本科读几年
- 红米pro android o刷机,红米Pro官方卡刷机教程 怎么刷机
- 海域使用证换不动产证的步骤和注意问题
- 2018软工个人总结
- 这三个步骤让你知道WPS如何转换成WORD文档
- UVA 488 Triangle Wave
- 【转载】发一篇能激励大家拼搏的文章,文中内容属实
- VMware 12 Exception 0xc0000005
- python cmd以管理员执行指令(网卡切断与打开)
- C语言malloc不需要强转
- 戴尔(DELL)笔记本的型号解析
- 【SolidWorks插件】 凯元工具(KYTool)
- 如何在网上查找免费电子书
热门文章
- 京东云宙斯上传单张图片php,PHP图片上传程序(单张)
- webpack5升级踩坑(process、Buffer is not defined)
- java的main函数返回值_Java中的main方法
- 20190416 关于学历
- 【C语言】sizeof和strlen的区别
- 容联孙昌勋:新通讯时代的造云者 | 保持愚钝和饥饿
- 微信屏蔽快的打车,说到底还是利益,但…不是用户利益
- Android平台数据抓取方案分享
- spring-security-5.0版本的xml基本配置
- 警惕团队“蘑菇种植法”