C\C++如何定义常量数组

wubicheng 2013-08-06 08:01:03
不是在类里面。
一般这样定义 const int a[3]={1,2,3};
const float f[3]={1.1,2.2,3.3};
a和f中的元素好像都可以改变,如果拿a的元素来做数组长度的话编译器就会报错,有没有什么方法定义常量数组,可以使得数组的元素也是一个定值。
不要使用枚举,也不要使用动态分配。
...全文
12440 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wubicheng 2013-08-06
  • 打赏
  • 举报
回复
哦,懂了,就是说通过数组是行不通的对吧?这样的话那我就没有办法了,谢谢大家了,今天先不结贴,太晚了,明天我再来结贴,有好的想法的还可以继续提。
lpcads 2013-08-06
  • 打赏
  • 举报
回复
引用 10 楼 wubicheng 的回复:
哎呀哎呀,都说了,我没有按C标准来写程序,本来用的就不是纯C编译器,在C++中是允许const int变量以及enum变量作为数组长度的,所以我想能不能用一个const int 数组来定义长度,因为我原本以为const int数组中的元素也是固定不可改变的,所以就想当然了,结果发现编译器报错,才知道自己是错的,我在这里提问是想知道有没有办法定义一个数组,使得数组中的元素是不可改变的常量。
c++中建议用const int N = 3;来代替宏#define N 3 ,不仅仅是允许,是建议。因而可以想到的是,编译器不会真在常量数据段中为3分配空间,而是像宏一样,在编译时把所有的N换成3。 但对于 const int a[3],编译器会在数据段中为数组开辟空间,于是b[(a[0])]小括号中的值就只能运行时确定了。
wubicheng 2013-08-06
  • 打赏
  • 举报
回复
哎呀哎呀,都说了,我没有按C标准来写程序,本来用的就不是纯C编译器,在C++中是允许const int变量以及enum变量作为数组长度的,所以我想能不能用一个const int 数组来定义长度,因为我原本以为const int数组中的元素也是固定不可改变的,所以就想当然了,结果发现编译器报错,才知道自己是错的,我在这里提问是想知道有没有办法定义一个数组,使得数组中的元素是不可改变的常量。
lpcads 2013-08-06
  • 打赏
  • 举报
回复

const int a[]={1,2,3};

int main ()
{
	char b[a[0]]; //lz是要这样用吗?
	return 0;
}
上面的代码中,虽然a数组在只读代码段,但 a[0] 的值只有在运行时才能知道(a[0]等价于*(a+0)),在“常用”的c标准(c89)中,是非法的。
lpcads 2013-08-06
  • 打赏
  • 举报
回复
引用 2 楼 huang369509940 的回复:
你的意思是int b[a[0]]吗? 不行 只能动态分配 我手头正好有书翻了一下 谭浩强 C程序设计(第四版) P143 中这样说明: 如果在被调用的函数(不包括主函数)中定义数组,其长度可以是变量或非常量表达式。如: void func(int n) { int a[2*n]; //合法,n的值从实参传来 …… } 但是我试了一下 行不通的 这书坑爹啊 D:\test\test.cpp(4) : error C2057: expected constant expression D:\test\test.cpp(4) : error C2466: cannot allocate an array of constant size 0 D:\test\test.cpp(4) : error C2133: 'b' : unknown size 只能动态分配了 那个也不是很复杂啊
C99标准中引进了可变长数组 好神奇,老谭竟然知道
wubicheng 2013-08-06
  • 打赏
  • 举报
回复
呃,大家都误解了,我不是在说纯C,看题目就知道了,是C\C++,不是C,纯C的话是不可以这样定义数组长度的,即使是枚举貌似也不行,好像只能用1、2、3这样的数值常量,长期使用VS集成编译环境,所以对于纯C有哪些不行不是太清楚,我说的是C++或带C++特性的C语言,编译器用的VS。 不过看了看,大家的意思就是说这样行不通对吧?还有没有高人指点指点,如果真的不行那我就算了,只能是去用枚举或#define了,虽然名字上不太好取(想用数组也是这个原因)。
黄大仙儿 2013-08-06
  • 打赏
  • 举报
回复
嗯也是 在gcc中没试过
引用 4 楼 zodiac1111 的回复:
这个c语言标准里没说一定要实现,由编译器自由发挥,gcc实现了int a[n]; 这样的定义.
[/quote]
mujiok2003 2013-08-06
  • 打赏
  • 举报
回复
除了强制转换,不能修改。 强制转换意味着你(程序员)要对你行为负一切责任。
zodiac1111 2013-08-06
  • 打赏
  • 举报
回复
这个c语言标准里没说一定要实现,由编译器自由发挥,gcc实现了int a[n]; 这样的定义.
引用 2 楼 huang369509940 的回复:
你的意思是int b[a[0]]吗? 不行 只能动态分配 我手头正好有书翻了一下 谭浩强 C程序设计(第四版) P143 中这样说明: 如果在被调用的函数(不包括主函数)中定义数组,其长度可以是变量或非常量表达式。如: void func(int n) { int a[2*n]; //合法,n的值从实参传来 …… } 但是我试了一下 行不通的 这书坑爹啊 D:\test\test.cpp(4) : error C2057: expected constant expression D:\test\test.cpp(4) : error C2466: cannot allocate an array of constant size 0 D:\test\test.cpp(4) : error C2133: 'b' : unknown size 只能动态分配了 那个也不是很复杂啊
zodiac1111 2013-08-06
  • 打赏
  • 举报
回复
const int a[3]={1,2,3};
const float f[3]={1.1,2.2,3.3};
* "a和f中的元素好像都可以改变" 这个不能在本进程(?)中改变的(g++ a[0]=1;是会报错的. * "如果拿a的元素来做数组长度的话编译器就会报错" (不知道哪个)标准的C编译器,数组下标是不能用变量的,只读变量(const)也不行.(可能不准确) * 在c++(g++)中,以下代码是可以编译通过的,
int main(void)
{
        const int a[3]={1,2,3};
        int b[a[0]];
        return 0;
}
c中据我所知是有用动态分配来实现变长数组的(realloc).
黄大仙儿 2013-08-06
  • 打赏
  • 举报
回复
你的意思是int b[a[0]]吗? 不行 只能动态分配 我手头正好有书翻了一下 谭浩强 C程序设计(第四版) P143 中这样说明: 如果在被调用的函数(不包括主函数)中定义数组,其长度可以是变量或非常量表达式。如: void func(int n) { int a[2*n]; //合法,n的值从实参传来 …… } 但是我试了一下 行不通的 这书坑爹啊 D:\test\test.cpp(4) : error C2057: expected constant expression D:\test\test.cpp(4) : error C2466: cannot allocate an array of constant size 0 D:\test\test.cpp(4) : error C2133: 'b' : unknown size 只能动态分配了 那个也不是很复杂啊
max_min_ 2013-08-06
  • 打赏
  • 举报
回复
不推荐干这样的事情,常量的数组,需要是啥?

struct A
{
static const int arr[10];
};
const int A::arr[10]={1,2,3};

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧