C/C++ 数组下标可以是负值

我们知道,数组的第一个元素下标是 0。数组的范围也就是从 array[0] 到 array[size – 1]。 但实际上C/C++ 支持正负下标。 负下标必须在数组边界内;否则结果不可预知。 以下代码显示了正数组和负数组下标:

#include <iostream>
using namespace std;

int main() {
    int intArray[1024];
    for (int i = 0, j = 0; i < 1024; i++)
    {
        intArray[i] = j++;
    }

    cout << intArray[512] << endl;   // 512

    int *midArray = &intArray[512];  // 指向了数组中间的数据

    cout << midArray[-256] << endl;  // 256

    cout << intArray[-256] << endl;  // 得到不可预知的结果
}

最后一行中的负下标可能产生运行时错误,因为它在内存中指向比数组的原点低 256 个字节的地址。 指针 midArray 会初始化为 intArray 的中点;因此可以对其使用正数组和负数组索引。 数组下标错误不会产生编译时错误,但它们会产生不可预知的结果。

参考:http://blog.csdn.net/mycwq/article/details/43373965

https://msdn.microsoft.com/en/library/59682zc4.aspx

时间: 2024-07-31 14:31:27

C/C++ 数组下标可以是负值的相关文章

用PHP实现的快速排序算法(支持记录原始数组下标)

代码如下 <?php /** * 快速排序 */ define("MAX_LENGTH_INSERT_SORT", 7); class QuickSort { /** * 交换数组i和j的值 */ function swap(&$data=array(), $i, $j) { $temp = $data[$i]; $data[$i] = $data[$j]; $data[$j] = $temp; } /** * 交换数组data中子表的记录,是枢轴记录到位,并返回其所在位

重载二维数组下标&quot;[][]&quot;

问题来源:(待续) 解决办法: (1) 可变长数组 对于可变的二维数组下标重载,在数组初始化时指定维数,之后可以像一般的二维数组进行赋值和取值操作. 当然,使用模板template来实现更好. 1 class Array2d{ 2 private: 3 int* a; 4 int nrow; 5 int ncol; 6 public: 7 Array2d(const int nrow_, const int ncol_) 8 :nrow(nrow_), ncol(ncol_) 9 { 10 a

网易云课堂_C++程序设计入门(下)_第8单元:年年岁岁花相似– 运算符重载_第8单元 - 作业2:OJ编程 - 重载数组下标运算符

第8单元 - 作业2:OJ编程 - 重载数组下标运算符 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 练习数组下标运算符重载 依照学术诚信条款,我保证此作业是本人独立完成的. 1 练习数组下标运算符重载(6分) 本题目具体内容请参见 [第8单元 - 单元作业2说明] 时间限制:500ms内存限制:32000kb #include <iostream> #in

char值不能直接用作数组下标

#include <stdio.h> //用 char 的值作为数组下标(例如,统计字符串中每个字符出现的次数),要考虑到 //char 可能是负数.有的人考虑到了,先强制转型为 unsigned int 再用作下标,这仍然 //是错的,因为char会先字节扩展变为int,再从int变为unsigned int. //正确的做法是,先强制转型为 unsigned char,再用作下标,这时会再隐式转换为int. int main() { char a = 128; printf("%

Objective-C如何自己实现一个基于数组下标的属性访问模式

在iOS6.0以及OS X10.8之后,Apple引入了一套非正式协议(informal protocol)与Objective-C语法直接绑定.当你实现了这其中的方法之后即可使用数组下标来访问属性元素 在Foundation库中,NSArray类实现了- (id)objectAtIndexedSubscript:(NSUInteger)idx方法.因此,我们可以这么来访问数组元素: NSArray *arr = @[@100, @200, @300]; NSNumber *num = arr[

Codeforces Round #279 (Div. 2)B. Queue(构造法,数组下标的巧用)

这道题不错,思维上不难想到规律,但是如何写出优雅的代码比较考功力. 首先第一个人的序号可以确定,那么接下来所有奇数位的序号就可以一个连一个的确定了.然后a[i].first==0时的a[i].secod就是第二个人的序号,然后偶数位的序号也可以一个连一个的确定了. 用一个next数组,其下标就是a[i].first,其值就是a[i].second,这样巧妙地使用数组下标就解决了“串链子”这个难点,我之前想的每次用二分来找真是弱爆了.. 而在找第一个人的序号时也是妙用flag数组下标. #incl

数组下标运算

1.把一维下标变成二维下标,如下例中有16个元素,每行4个元素,则有 for(int i=0;i数组下标运算

当数组下标要使用数字时用字符

function getOlnyNumChange(obj){ var num = obj.val(), nowCheck = obj.parents(".out_label").find("input[name='checkShop[]']:checked").val()+""; if (nowCheck) { var this_id = []; this_id[nowCheck] = num; console.log(this_id) };

C++入门经典-例9.6-有界数组模板,数组下标的越界警告

1:C++语言不能检查数组下标是否越界,如果下标越界就会造成程序崩溃,而程序员在编辑代码时很难找到下标越界错误.那么如何能使数组进行下标越界检测呢?此时可以建立数组模板,在定义模板时对数组的下标进行检查. 在模板中想要获取下标值,需要重载数组下标运算符"[]",重载数组下标运算符后使用模板类实例化数组,就可以进行下标越界检测了.例如: #include <cassert> template <class T,int b> class Array { T&