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]);
}
此程序能正确运行。但是很多书上说数组下标不能为负。这是为什么呢? 展开
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]);
}
此程序能正确运行。但是很多书上说数组下标不能为负。这是为什么呢? 展开
6个回答
展开全部
分清声明还是语句。
声明里的中括号里的数字不能为负。例如 int a[-2]; 是错的,数组大小不能为负。
语句里的中括号,C/C++ 看成运算符,不叫标点符号。
数组元素和指针有恒等关系:
a[i] == *(a+i)
所以,i 为 负 的时候,a[i] == *(a- fabs(i))。只要 a-fabs(i) 这个地址里 有 数值,就可以拿来 运算使用。
"很多书上说数组下标不能为负" -- 因为是初级教材。
高级教材里甚至提到, a[i] == i[a] 这也是正确的 !(有人在“知道”里问过,我也回答过。)
当然,只能是变量形式,不能写阿拉伯数字,事实上,也确确实实正确的。
声明里的中括号里的数字不能为负。例如 int a[-2]; 是错的,数组大小不能为负。
语句里的中括号,C/C++ 看成运算符,不叫标点符号。
数组元素和指针有恒等关系:
a[i] == *(a+i)
所以,i 为 负 的时候,a[i] == *(a- fabs(i))。只要 a-fabs(i) 这个地址里 有 数值,就可以拿来 运算使用。
"很多书上说数组下标不能为负" -- 因为是初级教材。
高级教材里甚至提到, a[i] == i[a] 这也是正确的 !(有人在“知道”里问过,我也回答过。)
当然,只能是变量形式,不能写阿拉伯数字,事实上,也确确实实正确的。
展开全部
1 C语言数组下标可以为负,但是十分不建议这样写。
2 分析
给出的示例中定义了一维数组a
int a[5];
对于数组a来说,a[-1]的写法编译器是通过的,其代表a[0]的前一个元素。但是像a[-1]这样的写法是十分危险的,因为a[-1]的地址是不确定的,万一它指向了操作系统的某块内存,则可能影响到操作系统的运行。所以不建议数组下标为负的写法。
3 扩展C语言在代码运行前不会对数组是否下标越界、溢出等异常进行警告或处理。
C#,Java等语言会将下标为负等当做是异常来看待。
在Python中,数组的下标为-1代表数组的最后一个元素,下标为-2代表数组的倒数第二个元素,其余依次类推。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是这样的,如果你定义了一个数组后,比如 int a[5]; 在内存中会为这个数组分配5个存储单元,此时如果你用这5个单元是完全没问题的,因为这5个已经被你申请了,而其他没被申请的单元是不能随便用的,比如 a[-2]是表示 a[0]前的两个单元(每个大小编译系统会根据你声明的数组元素的类型确定,在这个问题中每个单元都是 int型的),如果碰巧这个单元没被分配给其他变量时你使用会没有问题,但是如果已经被其他变量占据,那此时你使用就会出现问题,所以书上要求不能为负的是正确的,你的使用没问题是巧合。即使偶尔可以使用,也不要这样做,第一这样做没什么意义,第二会使程序存在潜在的隐患。
而如果你在你的程序里再有下面的定义语句的话 int *p=&a[3]; 那你使用 p[-2]就完全没问题了,因为它表示 a[1].
而如果你在你的程序里再有下面的定义语句的话 int *p=&a[3]; 那你使用 p[-2]就完全没问题了,因为它表示 a[1].
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
下标可以是负值,它的意思是向前寻址,前提是你知道向前寻址寻的内存地址的东西是你之前已经指定好的,就相当于你动态开辟一块内存给你的数组,这样这个内存里面的所有数据都是你需要的,向前寻址也没什么问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不可以,下标必须是整数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询