c和c++数组初始化一点小区别
2012-07-15 10:40
127 查看
为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?
const int n = 5;
int a
;
答案与分析:
1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的。
2)、注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是 ANSI C对数组的规定限制了它(实际上在GCC和VS2005中编译以上代码;确实没有错误产生,也没有给出警告!)。
const int n = 5;
int a
;
答案与分析:
1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的。
2)、注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是 ANSI C对数组的规定限制了它(实际上在GCC和VS2005中编译以上代码;确实没有错误产生,也没有给出警告!)。
相关文章推荐
- 用“字符”初始化数组与用“字符串”初始化数组的一点区别
- C/C++ - 数组初始化列表为空的区别
- 关于LinuxC/C++中字符指针char * str 与字符数组 char str []的一点小区别
- 关于LinuxC/C++中字符指针char * str 与字符数组 char str []的一点小区别
- C++与Java数组的申明创建初始化的区别
- java学习(12)对象数组初始化 java与C++的区别
- C++数组初始化方法
- C++中静态初始化数组与动态初始化数组详解
- c++中初始化和赋值的区别
- C++ 与“类”有关的注意事项总结(十):类对象数组初始化(三种方法)
- C/C++数组名与指针区别
- 动态创建二维vector数组 C和C++ 及指针与引用的区别
- C++中int *p[4]和 int (*q)[4]的区别 (指针数组和数组指针)
- c/c++数组名和指针区别深入探索
- [原创]C/C++中复杂指针声明&&数组名的一点小事
- 从C++指针定义字符串和数组定义字符串区别到C++堆和栈区别
- c++与java的一点区别
- C/C++数组名与指针区别深入探索
- C/C++静态数组与动态数组的区别
- C++中数组初始化的方法级不同方法之间的差别