const关键字(摘抄&总结)

4.3.4 const关键字与指针

4.3.4.1 const修饰指针的4种形式

(1)const关键字,在C语言用来修饰变量,表示这个变量是常量

(2)const修饰指针有4种形式,区分清楚这4种即可全部理解const和指针

第一种:const int *p; //p本身不是const的,而p指向的变量是const的

第二种:int const *p; //p本身不是const的,而p指向的变量是const的

第三种:int * const p; //p本身是const的,而p指向的变量不是const的

第四种:const int * const p;//p本身是const的,而p指向的变量也是const的

(3)关于指针变量的理解,主要设计两个变量:第一个是指针变量p本身,第二个是p指向的那个变量(*p)。一个const关键字只能修饰一个变量,所以弄清楚这四个表达式的关键就是搞清楚const放在某个位置是修饰谁的。

4.3.4.2 const修饰的变量真的不能改吗?

(1)课堂练习说明:const变量可以修改(前提是gcc环境、VC6.0 环境)

(2)在某些单片机环境下,const变量是不可以修改的。

const变量到底能不能被修改,取决于具体的环境,C语言本身并没有完全一直的要求。

(3)在gcc环境,const是通过编译器在编译时执行检查来确保实现的(也就是说const类型的变量不能改是编译错误,不是运行错误)所以只要骗过编译器,就可以修改const定义的常量,而运行时不会报错。

(4)更深一层的原因,是因为gcc把const类型的变量也放在了data段,其实和普通的全局变量放在data段是一样的,只是通过编译器认定的这个变量是const的,运行时并没有标记const标志,所以只要骗过编译器就可以修改了。

4.3.4.3 const究竟应该怎么用

(1)const是在编译器中实现的,编译时检查。并非不能骗过。所以在C语言中使用const就好像是一种道德约束,所以大家使用const时更多的是传递一种信息,就是告诉编译器、也告诉读程序的人,这个变量是不应该也不必被修改的。


4.3.10 输入型参数与输出型参数

4.3.10.1 函数为什么需要形参与返回值

(1)函数名是一个符号,表示整个函数代码段的首地址,实质是一个指针常量,所以在程序中使用到函数名时都是当地址用的,用来调用这个函数的。

(2)函数体是函数的关键,由一对{}括起来,包含很多句代码,函数体就是函数实际做的工作。

(3)形参列表和返回值。形参是函数的输入部分,返回值是函数的输出部分。对函数的最好理解就是把函数看成一个加工机器,形参列表就是这个机器的原材料输入端;而返回值就是机器的成品输出端。

(4)其实没有形参列表和返回值,函数也能对数据加工,用全局变量即可。

(5)用全局变量来传参和用函数列表返回值来传参各有特点,在实践中都有使用。总的来说函数传参用的比较多,因为这样可以实现模块化编程,而C语言中也是尽量减少使用全局变量。

(6)全局变量传参最大的好处就是省略了函数传参的开销,所以效率要高一些;但是实战中用的最多的还是传参,如果传参很多开销很大,通常做法是把很多参数打包成一个结构体,然后传结构体变量指针进去。

4.3.10.2 函数传参中使用const指针

(1)const一般用在函数列表中,用法是const int *p(意义是指针变量p本身可以改变,而p指向的变量是不可以改变的)

(2)const用来修饰指针做函数传参,作用就在于声明在函数内部不会改变这个指针所指向的内容,所以在给函数传一个不可改变的指针(char *p ="linux"这种)不会触发错误;而未声明为const的指针的函数,你给他传一个不可更改的指针的时候就要小心了。

4.3.10.3 函数需要向外部返回多个值时怎么办?

(1)一般来说,函数的输入部分就是函数参数,输出部分就是返回值。问题是函数的参数可以有很多个,而返回值只能有1个。这就造成了无法让一个函数返回多个值。

(2)现实编程中,一个函数需要多个返回值是非常普遍的,因此完全依赖于返回值是不靠谱的,通常的做法是用参数来返回(在典型的Linux风格中,返回值不是用来返回结果的,而是用来返回0或者负数用来表示程序执行结果是对还是错,是成功还是失败)

(3)普遍做法,编程中函数的输入和输出都是靠函数参数的,返回值只是用来表示函数执行的结果。如果这个函数用来做输入的,就叫做输入型参数;如果这个参数的目的是用来做输出的,就叫做输出型参数。

(4)输出型参数就是用来让函数把内部参数输出到函数外部的。

4.3.10.4 总结

值传递:输入型参数

地址传递:输入和输出型参数都可以。

(1)看到一个函数原型,怎么一眼看出那个函数做输入那个做输出?

函数传参如果传的是普通变量(值)那肯定是输入型参数,如果传指针(地址)就有2种可能性,为了区别,经常做法就是:如果这个参数是做输入的(通常做输入的在函数内部只需要读取这个参数而不需要改变它)就在指针前面加const修饰;如果函数参数是指针变量并且没有加const修饰,那么表示这个参数用来做输出型参数的。


其他参考:

https://baike.so.com/doc/5414352-7563310.html

 

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值