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 修饰之后,不能改变他的值)。

如果参数作为输入参数,可以防止数据被改变,起到保护作用,增加程序的健壮性;

三.猜你喜欢

  1. C 语言 数组下标越界和内存溢出区别
  2. C 语言 指针声明和定义
  3. C 语言 指针 p++ / p–
  4. C 语言 p++/§++/_(p++)/_p++
  5. C 语言 使用指针遍历数组
  6. C 语言 指针和数组区别
  7. C 语言 指针数组和数组指针区别
  8. C 语言 空指针 NULL
  9. C 语言 void 指针
  10. C 语言 野指针
  11. C 语言 函数值传递和址传递
  12. C 语言 函数缺省参数
  13. C 语言 函数不定长参数
  14. C 语言 函数指针
  15. C 语言 指针函数
  16. C 语言 回调函数 callback
  17. C 语言 typedef
  18. C 语言 define 定义常量
  19. C 语言 define 防止头文件重复包含
  20. C 语言 #pragma once
  21. C 语言 #include <> 与 #include “” 区别
  22. C 语言 const 修饰变量
  23. C 语言 const 修饰指针
  24. C语言 const 修饰函数
  25. C 语言 const 修饰函数参数
  26. www.bdsoba.com
    www.awaedu.com
    www.sobd.cc

C语言 const 修饰函数参数 - C语言零基础入门教程相关推荐

  1. Python eval 与 exec 函数的区别 - Python零基础入门教程

    目录 一.Python eval 与 exec 函数的区别 二.价值 10 个亿的智能机器人核心代码 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Py ...

  2. C语言 main 函数参数 main(int argc, char *argv[]) - C语言零基础入门教程

    目录 一.main 函数写法 二.main 函数参数简介 三.使用 main 函数参数 1.打印 main 函数参数 a.直接运行 exe 文件 b.打开 cmd 命令行窗口执行 exe 文件 c.打 ...

  3. C语言 函数不定长参数 ##__VA_ARGS__经典案例 - C语言零基础入门教程

    目录 一.##__VA_ARGS__简介 二.##__VA_ARGS__经典案例 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.## ...

  4. C/C++ _wcsupr_s 函数 – unicode 字符串小写转大写 - C语言零基础入门教程

    目录 一._wcsupr_s 函数简介 二._wcsupr_s 函数实战 三.注意问题 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 零 ...

  5. C/C++ _wcslwr_s 函数 – unicode 字符串大写转小写 - C语言零基础入门教程

    目录 一._wcslwr_s 函数简介 二._wcslwr_s 函数实战 三.注意问题 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 零 ...

  6. C/C++ _strupr_s 函数 – 字符串小写转大写 - C语言零基础入门教程

    目录 一._strupr_s 函数简介 二._strupr_s 函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 零基础 C/C+ ...

  7. C/C++ _strlwr_s 函数 – 字符串大写转小写- C语言零基础入门教程

    目录 一._strlwr_s 函数简介 二._strlwr_s 函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 零基础 C/C+ ...

  8. C/C++ atol函数- C语言零基础入门教程

    目录 一.ltoa 函数简介 二.int/long/unsigned long 区别 1.无符号整形(16 位系统) 2.有符号整形(16 位系统) 3.int 和 long 区别 三.atol 函数 ...

  9. C/C++ strtol 函数 - C语言零基础入门教程

    目录 一.strtol 函数简介 二.strtol 函数函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.strtol 函数简 ...

最新文章

  1. XXX语录,可以不信,但不能不看
  2. php入门05-会话控制(session与cookie)
  3. [html] Standards模式和Quirks模式有什么区别?
  4. 监控linux内存,linux 监控系统资源-内存
  5. 堆栈关系java_从关键字说Java对象、引用、指针、堆栈的关系
  6. 将对象绑定到WinForm中的combobox时出现的奇怪错误:组合框的下拉项太多!
  7. Kafka从上手到实践 - Kafka CLI:Reseting Offset Config CLI | 凌云时刻
  8. 宾州州立大学计算机本科,2020年宾州州立大学本科读几年
  9. 红米pro android o刷机,红米Pro官方卡刷机教程 怎么刷机
  10. 海域使用证换不动产证的步骤和注意问题
  11. 2018软工个人总结
  12. 这三个步骤让你知道WPS如何转换成WORD文档
  13. UVA 488 Triangle Wave
  14. 【转载】发一篇能激励大家拼搏的文章,文中内容属实
  15. VMware 12 Exception 0xc0000005
  16. python cmd以管理员执行指令(网卡切断与打开)
  17. C语言malloc不需要强转
  18. 戴尔(DELL)笔记本的型号解析
  19. 【SolidWorks插件】 凯元工具(KYTool)
  20. 如何在网上查找免费电子书

热门文章

  1. 京东云宙斯上传单张图片php,PHP图片上传程序(单张)
  2. webpack5升级踩坑(process、Buffer is not defined)
  3. java的main函数返回值_Java中的main方法
  4. 20190416 关于学历
  5. 【C语言】sizeof和strlen的区别
  6. 容联孙昌勋:新通讯时代的造云者 | 保持愚钝和饥饿
  7. 微信屏蔽快的打车,说到底还是利益,但…不是用户利益
  8. Android平台数据抓取方案分享
  9. spring-security-5.0版本的xml基本配置
  10. 警惕团队“蘑菇种植法”