2 thomassoloist ThomasSoloist 于 2014.11.06 22:28 提问

C++的数组,为什么a[i]=i[a],求解释

比如声明一个数组
int a[5]={1,2,3,4,5}

这时 a[3] 和 3[a] 的值都是3,求解为什么?

据说是因为i[a]=*(a+i),但是,为什么是这么规定的?是C++内定的规则,还是因为[ ] 中括号除了定义数组,还有更多的意义?求详细解释,非常感谢。

2个回答

mymtom
mymtom   Rxr 2014.11.10 16:25
已采纳

是的[]有两个用途,数组声明 和 下标操作符,
注意在Array subscripting部分,E1[E2],只要有一个操作符为指针即可,没有顺序的哦。
实际上在C语言中,Array subscripting是完全可以不要的, 因为
E1[E2]
完全等价于
(*(E1+(E2)))

数组声明
3.5.4.2 Array declarators

Constraints

The expression that specifies the size of an array shall be an
integral constant expression that has a value greater than zero.

Semantics

If, in the declaration `` T D1 ,'' D1 has the form

     D[ constant-expression<opt>]

下标操作符
3.3.2.1 Array subscripting

Constraints

**One of the expressions shall have type ``pointer to object type ,''

the other expression shall have integral type, and the result has type
`` type .''**

Semantics

A postfix expression followed by an expression in square brackets
[] is a subscripted designation of a member of an array object. The
definition of the subscript operator [] is that E1[E2] is identical to
(*(E1+(E2))) . Because of the conversion rules that apply to the
binary + operator, if E1 is an array object (equivalently, a pointer
to the initial member of an array object) and E2 is an integer, E1[E2]
designates the E2 -th member of E1 (counting from zero).

happyparrot
happyparrot   Ds   Rxr 2014.11.07 09:26

a是一个地址值,3是一个偏移量值。a[3]和3[a]都相当于这两个值相加,所以结果都指向同一个地址。
C++中数组与指针在很多方面是一致的,有些类似于相同内容的不同展示方式,但细节上还是有所区别的。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Problem G: 求二维数组中的鞍点【数组】
求二维数组中的鞍点【数组】
求数组中的逆序对数(inversion pair)
设A[1..n]是一个包含N个非负整数的数组。如果在iA[j],则(i,j)就称为A中的一个逆序对(inversion)。 a)列出数组[2,3,8,6,1]的5个逆序。 b)如果数组的元素取自集合{1,2,...,n},那么,怎样的数组含有最多的逆序对?它包含多少个逆序对? c)插入排序的运行时间与输入数组中逆序对的数量之间有怎样的关系?说明你的理由。 d)给出一个算法,它能用O(nlo
求逆序对 (用归并) nlogn
nlongn 逆序对 外加归并的讲解
求逆序对(复杂度为nlogn)
问题: 对于一个包含N个非负整数的数组A[1..n],如果有i A[ j ],则称(A[ i] ,A[ j] )为数组A中的一个逆序对。 例如,数组(3,1,4,5,2)的逆序对有(3,1),(3,2),(4,2),(5,2),共4个。 给定一个数组,求该数组中包含多少个逆序对。 要求时间复杂度为nlog(n) 算法分析: 这个题目十分的经典,是归并排序的一个完美应用,分治
找出数组a[]中符合a[i]+a[j]=K的数对
1.问题描述  在一个整数数组中,元素都为整数,没有重复数。设计一个算法找出满足两个数的和等于k值得数对。例如a[]={1,3,8,6,4}中两个数的和为7的数对为(1,6)和(3,4)。2. 解决方案2.1 暴力法  首先先到的可能就是暴力法,暴力没举出所有的数对然后再判对他们的和是否为K,但这种方法的时间复杂度为O(n^2),效率比较低,一般不可取。代码也就不写了。、2.2 二分法  先对数组进
高效的算法找出中间所有A[i] = i的下标
给定一个排好升序的数组A[1]、A[2]、……、A[n],其元素的值都两两不相等。请设计一高效的算法找出中间所有A[i] = i的下标。并分析其复杂度。 解析:首先分析一下这个数组,假设其中某个位置的A[i] = i,那么可以肯定的值,之前的A[x] > x,之后的A[x] 我给出的方法是二分查找,具体的做法是:我们假设一个新数组B,其元素是A[i] - i的值,这样
Problem B: 求二维数组中的鞍点【数组】
问题: Description 如果矩阵A中存在这样的一个元素A[i,j]满足条件:A[i,j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。请编程计算出m*n的矩阵A的所有马鞍点。 Input 输入m,n 然后输入数组中的每个元素 Output 输出m*n的矩阵A的所有马鞍点 Sample Input 3 31 7
uva 11424 GCD Extreme 求∑∑gcd(i,j) (1<i<n,i<j<n)
<br />Problem H<br />GCD Extreme<br />Input: Standard Input<br />Output: Standard Output <br /> <br />Given the value of N, you will have to find the value of G. The definition of G is given below:<br /><br /> <br />Here GCD(i,j) means the greatest common
[360面试题2018]:一个数组a[0...n-1],求a[j]-a[i]的最大值+求a[i]-a[j]的最大值,其中i<j
一、一个数组a[0...n-1],求a[j]-a[i]的最大值,其中i ===>两个变量:当前最小值min和当前最大差值maxdiff。遍历一遍数组,更新这两个变量 #include using namespace std; int main() { //int arr[]={12,-10,3,6,4,-1,5,8,6,7,10}; int n; cin>>n;
Lintcode-贪心-最大子数组和最小子数组
最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。 注意事项 子数组最少包含一个数 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 最小子数组 给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。 注意事项 子数组最少包含一个数字 样例 给出数组[1, -1, -2, 1],返回 -3