20170911_指针常量和常量指针的区别以及const和define的区别

20170911_指针常量和常量指针的区别以及const和define的区别

const和define的区别

1、const 常量有数据类型,而define 宏常量没有数据类型

2、编译器在编译程序时,会对const 常量进行类型安全检查

而对define 宏常量只进行简单的盲目的字符替换,不进行类型安全检查,所以很容易出现意料不到的错误。

3、使用const 常量可能比使用define 宏常量产生更小的目标代码

这是因为预处理器会“盲目的将宏名称替换为其值”,这可能会导致出现大量的宏值的备份,但是const 常量却不会出现这个问题,因为在内存中const 常量只有一份儿。

4、const 常量可以进行常量折叠(常量折叠:是指在编译时简单化常量表达式的一个过程,简单来说,就是将常量表达式计算求值,并用求出来的值来替换表达式,并放入常量表内),也即是说,编译器在编译时可以通过必要的计算把一个复杂的常量表达式缩减为简单的计算结果值。


指针常量和常量指针的区别

1、指向常量的指针:常量指针

常量指针,首先它是一个指针,然后这个指针指向的是常量对象,

因此,不允许使用这个指针来改变其所指向的内容的值;但是,却可以改变这个指针的指向。

const int num=10;

const int num2=20;

const int *cptr;                         它是指针常量定义时你初始化也可以,不初始化也可以。

const int *cptr = #            它是指针常量,它也等价于另一种写法:    int const *cptr = #     都没问题。

const int *cptr = &num2;          它是指针常量,你改变了指针的指向,没问题。

*cptr = 30;                                它是指针常量,你却改变了指针指向的内容值,出错!!!


2、本身是常量的指针:指针常量

指针常量,首先它是一个常量,然后这个常量是指针类型的,

因此,这个指针常量必须被初始化,即被初始化指向某一个变量,然后,这个指针的指向就不能再发生改变了(即不能再指向其他变量了),但是可以通过这个指针来修改该变量的值。

int num=10;

int num2=20;

int const *cptr;                      它是常量指针定义时你却没有初始化,出错!!!

int const *cptr = #         它是常量指针定义时你必须初始化,没问题。

*cptr = 30;                            它是常量指针,你改变了指针指向的内容值,没问题。

int const *cptr = &num2;       它是常量指针,你却改变了指针的指向,出错!!!



3、

(4)修饰常指针 
const int *A;     //const修饰指向的对象,A可变,A指向的对象不可变 
int const *A;     //const修饰指向的对象,A可变,A指向的对象不可变 
int *const A;     //const修饰指针A, A不可变,A指向的对象可变 
const int *const A;    //指针A和A指向的对象都不可变 

4、const的作用
const是C语言的一种关键字,起受保护,防止以外的变动的作用!可以修饰变量,参数,返回值,甚至函数体。const可以提高程序的健壮性,你只管用到你想用的任何地方。
(一)const修饰参数。const只能修饰输入参数。
1、如果输入参数是指针型的,用const修饰可以防止指针被意外修改。
2、如果参数采用值传递的方式,无需const,因为函数自动产生临时变量复制该参数。
3、非内部数据类型的参数,需要临时对象复制参数,而临时对象的构造,析构,复制较为费时,因此建议采用前加const的引用方式传递非内部数据类型。而内部数据类型无需引用传递。
(二)const修饰函数返回值。
1、函数返回const指针,表示该指针不能被改动,只能把该指针赋给const修饰的同类型指针变量。
2、函数返回值为值传递,函数会把返回值赋给外部临时变量,用const无意义!不管是内部还是非内部数据类型。
3、函数采用引用方式返回的场合不多,只出现在类的赋值函数中,目的是为了实现链式表达。
(三)const+成员函数。任何不修改数据成员的函数都应该声明为const类型,如果const成员函数修改了数据成员或者调用了其他函数修改数据成员,编译器都将报错!
class stack
{
public:
int GetCount(void) const ;
private:
int m_num;
};
int stack::GetCount(void) const
{
m_num++;
}
编译器输出错误信息:error C2166: l-value specifies const object。
(四)const 修饰变量,表示该变量不能被修改。
1、const char *p 表示 指向的内容不能改变
2、char * const p,就是将P声明为常指针,它的地址不能改变,是固定的,但是它的内容可以改变。
3、这种const指针是前两种的结合,使得指向的内容和地址都不能发生变化.
const double pi = 3.14159;
const double *const pi_ptr = π


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值