C语言数组下标可以为负吗

#include<stdio.h>main(){inti,a[5];for(i=-2;i<=2;i++)a[i]=i;for(i=-2;i<=2;i++)printf("... #include <stdio.h>
main()
{int i,a[5];
for(i=-2;i<=2;i++)
a[i]=i;
for(i=-2;i<=2;i++)
printf("%d\t",a[i]);
}
此程序能正确运行。但是很多书上说数组下标不能为负。这是为什么呢?
展开
 我来答
金色潜鸟
2013-12-12 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5614万
展开全部
分清声明还是语句。
声明里的中括号里的数字不能为负。例如 int a[-2]; 是错的,数组大小不能为负。

语句里的中括号,C/C++ 看成运算符,不叫标点符号。
数组元素和指针有恒等关系:
a[i] == *(a+i)
所以,i 为 负 的时候,a[i] == *(a- fabs(i))。只要 a-fabs(i) 这个地址里 有 数值,就可以拿来 运算使用。

"很多书上说数组下标不能为负" -- 因为是初级教材。

高级教材里甚至提到, a[i] == i[a] 这也是正确的 !(有人在“知道”里问过,我也回答过。)
当然,只能是变量形式,不能写阿拉伯数字,事实上,也确确实实正确的。
一口没水的枯井
推荐于2017-09-27 · TA获得超过2989个赞
知道小有建树答主
回答量:473
采纳率:100%
帮助的人:148万
展开全部

1 C语言数组下标可以为负,但是十分不建议这样写。

2 分析

    给出的示例中定义了一维数组a

int a[5];

对于数组a来说,a[-1]的写法编译器是通过的,其代表a[0]的前一个元素。但是像a[-1]这样的写法是十分危险的,因为a[-1]的地址是不确定的,万一它指向了操作系统的某块内存,则可能影响到操作系统的运行。所以不建议数组下标为负的写法。

3 扩展

    C语言在代码运行前不会对数组是否下标越界、溢出等异常进行警告或处理。

    C#,Java等语言会将下标为负等当做是异常来看待。

    在Python中,数组的下标为-1代表数组的最后一个元素,下标为-2代表数组的倒数第二个元素,其余依次类推。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tianyuwuse
2013-12-11 · TA获得超过1117个赞
知道小有建树答主
回答量:494
采纳率:100%
帮助的人:237万
展开全部
是这样的,如果你定义了一个数组后,比如 int a[5]; 在内存中会为这个数组分配5个存储单元,此时如果你用这5个单元是完全没问题的,因为这5个已经被你申请了,而其他没被申请的单元是不能随便用的,比如 a[-2]是表示 a[0]前的两个单元(每个大小编译系统会根据你声明的数组元素的类型确定,在这个问题中每个单元都是 int型的),如果碰巧这个单元没被分配给其他变量时你使用会没有问题,但是如果已经被其他变量占据,那此时你使用就会出现问题,所以书上要求不能为负的是正确的,你的使用没问题是巧合。即使偶尔可以使用,也不要这样做,第一这样做没什么意义,第二会使程序存在潜在的隐患。
而如果你在你的程序里再有下面的定义语句的话 int *p=&a[3]; 那你使用 p[-2]就完全没问题了,因为它表示 a[1].
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
仲镶天0l
2013-12-11
知道答主
回答量:11
采纳率:0%
帮助的人:3.6万
展开全部
下标可以是负值,它的意思是向前寻址,前提是你知道向前寻址寻的内存地址的东西是你之前已经指定好的,就相当于你动态开辟一块内存给你的数组,这样这个内存里面的所有数据都是你需要的,向前寻址也没什么问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
a1012144015
2015-05-23 · TA获得超过6415个赞
知道大有可为答主
回答量:9038
采纳率:40%
帮助的人:1331万
展开全部
不可以,下标必须是整数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式