C/C++几个常见概念分析(指针、引用 、const常量、#define)

(一):指针与引用的区别

                指针是什么,指针是一个变量(A)他值表示的是另一个变量(B)的地址。

                引用是什么,引用是一个变量(B)的另一个名字(C),取另一个变量名(C)他也代表(B)。

              (姑且用A、B、C分别代表三者)。

                      打个比方:

                一对夫妇生两个孩子B和B1。夫妇给B取了两个名字大名叫B同时也取了个小名叫C(这大约就是变量与引用的关系)。

                夫妇家有两个摇篮A与A1。夫妇把B放在A摇篮里睡觉,B1放在A1摇篮里睡觉(A与B大约就是指针与变量的关系)。

               

               那么指针与引用的区别有哪些呢?

               1、指针的值是可以改变,但引用的值是不能改变的。

                      就像摇篮A在B不用睡觉的时候可以给B1睡觉。但是给B取了小名叫C还可以给A1取小名叫C吗?

                2、批针值可以为空。但由于引用他表示的是一个已经存在的变量的别名,所以定义的时候就必需先初始化。

                      就像夫妇把摇篮A刚造出来的时候还没有给B用,他就空。但别名不一样取小名的时候夫妇一定是指给谁取的小名。

                 3、通过指针取得变量的值时,就需要*指针变量名。但是引用只需直接使用就可以了

                      就像夫妇约定好A给B用,但A1给B1用。当B在A摇篮里睡觉时如果夫妇要指出小孩B就可以说"睡在A摇篮里小孩",

                     也可以说C,因为C是B的小名呀。

                 4、sizeof(指针)与sizeof(引用)表示的值是不同的。

                       如果sizeof()表示的是重量的话。那么sizeof(A)表示的就是摇篮A的重量。sizeof(C)表示的就是B的小孩的重量。

 

(二):const常量用法总结及其与#define定义的宏常量的区别

                定义:const是用的声明"对象名"(变量名、引用名、类对象名、类名、数组名)表示一个常值的关键字(声明符)。

                1、常量:

                               声明时初始化。

                              

                               A- 常量与常指针的区别:

                               const char *ptr0 ;   声明的是(*ptr0)表示是一个常变量,即指针所指的对象是常量。但指针本身ptr0是可变量。

                               char const *ptr1;    同上(要始终记着在C语言中定义指针时char  *Ptr这个*Ptr是在一起的)。

                               以上不是说ptr0/ptr1所指的对象是完全不能修改的。只是说不能通过*ptr0/*ptr1来修改。

                               因为其所指的变量仍在内存中,可以通过修改内存来修改其值。

 

                               char *const ptr2;   声明ptr2是一个常量即常指针。但他所指的对象(*ptr2)是一个可变量。       

                               当然,可以把一个普通变量的地址赋给一个常指针。但必需常指针声明时同时初始化。

                               当然,不可以把一个常量的地址赋给一个不是指向常量的指针。因为一旦赋了不就表示常量是变量嘛,矛盾。

                              

                               B-常参数:

                                                 fun(const char *ptr0, char *const ptr1)

                                                 {

                                                       *ptr0 = 值    //错,不可更改

                                                        ptr0 = 值    //对,可以给指针重新赋值

                                                       *ptr1 = 值   //对,可以给常指针指向的变量重新赋值

                                                        ptr1 = 值   //错,不可以将一个常指针重新赋值

                                                 }

 

                 2、常成员函数:

                                             一个普通对象可以调用常成员函数,同时也可以调用普通成员函数。但调用常成员函数时,常成员函数不

                                             修改修改普通成员变量的值,除非成员变量被mutable修饰。

                                             一个常对象可以调用常成员函数,但他不能调用变通成员函数。

                                             函数重载时,常对象调用的是常成员函数,非常对象调用的是非常成员函数。

             

                 3、常成员变量:

                                            常成员变量只是在对象的生存期内是常量。对于整个类来说,它是一个可变量。

                                            不同的对象可以给其赋不同的值。

                                            因为所有的成员变量都是在对象的构造函数中初始化。

                   

                 4、C语言中const常量与C++中const常量的区别:

                         C++中const变量是编译期常量,编译器不为其分配内存空间只是将其值放在名字表。

                         C++中const常量更类似于#define定义的宏。

                         C中const只是定义了一个只读的常变量。要像普通变量一样分配内存空间。

                         C中并且不能像C++里面可以做为数组长度。

 

                 5、const常量与#define宏定义区别:

                        A-const常量有数据类型,编译器可以对其进行类型安全检查。而对#define只是进行简单的字符替换。

                        B-const常量是编译器在编译时确定其值。但#define是在预编译阶段就展开获得其值。

                        C-const常量系统会为其在静态内存区域中分配一个内存。程序在运行过程中使用得都是这一份拷贝。

                             但#define给的一个常数,程序每一个引用的地方都有一份其拷贝。所占用的内存比const常量多。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值