左和右这两个概念似乎被引用的挺多的. 好像有个漫画, 后来被改成电影, 向左走, 向右走? 仿佛还有小说什么的. 最近则是电影名字, <左右>.
今天用const的时候, 被左右搞糊涂了, 到底const作用到右边还是左边来着? 比如:
const int * p; -------- ①
int * const p; -------- ②
int const * p; -------- ③
答案:
①和③是一样的, 指向的整数是常量, 不可改变; ②指针是常量, 不可改变.
所以, 是左.
当然, ①和③指向的整数不能通过*p的方式赋值,但并不影响通过别的方式使之改变. 比如再定义一个普通指针指向那个地址, 那么可以通过这个普通指针改变地址里面的值.
另:
const位于头文件中:一般而言,定义不允许出现在头文件中,因为定义只能有一次,而声明可以有多次。但是用C++中const定义的变量可以位于头文件中。原因在于c++中const定义的变量默认是局部变量。由此,以static修饰的变量定义可以出现在C语言的头文件中。
const更严谨,因为有类型限制;但const要占用额外的空间,编译出的程序体积大些:
// a.h //b.h
#define CC 7 int const CC = 7;
---------------------- ----------------------
//a.c //b.c
#include "a.h" #include "b.h"
int main() int main()
{ {
int i = CC; int i = CC;
return 0; return 0;
} }
---------------------- ----------------------
//a1.c //b1.c
#include "a.h" #include "b.h"
void f1() void f1()
{ {
int i = CC; int i = CC;
} }
---------------------- ----------------------
$g++ a.c a1.c -S
$g++ b.c b1.c -S
下图左边是a.s, 右边是b.s。可看出b.s多了rodata区域。
阅读(1084) | 评论(0) | 转发(0) |