引用 18 楼 FengPrince 的回复: 引用 17 楼 supermegaboy 的回复:引用 楼主 FengPrince 的回复:int i=1; int j=(int)&i; int a[(int)&i]; 为什么(int)&i作为常量可以为全局变量j初始化,却不能作为静态数组的大小……
地址在编译期向来不是常量,只是相对偏移。连接器的作用才是确定这些地址的最终值。
引用 17 楼 supermegaboy 的回复:引用 楼主 FengPrince 的回复:int i=1; int j=(int)&i; int a[(int)&i]; 为什么(int)&i作为常量可以为全局变量j初始化,却不能作为静态数组的大小。 好奇怪啊,何解??? 你有两个误……
引用 14 楼 FengPrince 的回复:引用 13 楼 l821829886 的回复:正解: 因为(int)&i是i的地址、存储在内存的栈区、并非存储在静态区的常量,非常量不能用来初始化数组的大小,结果导致编译不通过!!! 可以看看栈区、堆区、静态区的存储区别。 静态区与常量有半毛钱关系吗?好像是木有吧。。。 如果你非要说常量存储在……
引用 楼主 FengPrince 的回复:int i=1; int j=(int)&i; int a[(int)&i]; 为什么(int)&i作为常量可以为全局变量j初始化,却不能作为静态数组的大小。 好奇怪啊,何解??? 你有两个误区,一是以为由常量表达式通过一定运算得出的结果也属于常量表达式,这个观念是……
int i=1; int j=(int)&i; int a[(int)&i]; 为什么(int)&i作为常量可以为全局变量j初始化,却不能作为静态数组的大小。 好奇怪啊,何解???
引用 13 楼 l821829886 的回复:正解: 因为(int)&i是i的地址、存储在内存的栈区、并非存储在静态区的常量,非常量不能用来初始化数组的大小,结果导致编译不通过!!! 可以看看栈区、堆区、静态区的存储区别。 静态区与常量有半毛钱关系吗?好像是木有吧。。。 如果你非要说常量存储在静态区,我无话可说。 i的地址编译期就可以确定,比如……
正解: 因为(int)&i是i的地址、存储在内存的栈区、并非存储在静态区的常量,非常量不能用来初始化数组的大小,结果导致编译不通过!!! 可以看看栈区、堆区、静态区的存储区别。
没错 i的地址是运行时分配的,连编译都不通过(因为数字中的是变量),所以出现3个errors了
第一,4楼的回答是正确的。 第二,看到5楼,我没兴趣解释任何东西。
凭什么认为(int)&i是常量?
69,371
社区成员
243,082
社区内容
加载中
试试用AI创作助手写篇文章吧