为什么在C ++中无法对声明为数组的变量进行增量或数学运算(如乘法)

时间:2018-08-26 12:51:16

标签: c++ arrays pointers

为什么在C ++中,即使变量存储数组的起始地址,声明为数组的变量也不能递增或递减或乘以2等。因此,如果我们增加数组变量,它应该指向下一个元素,如果乘以2并且数组长度大于x * 2值,该怎么办? 例如

#include <iostream>
using namespace std;
int main()
{
     int x[] = {12,33,41,55,68};
     cout<<x<<"\n";          // Output : 0x7af786c84320
     cout<<x+1<<"\n";        // Output : 0x7af786c84324
     cout<<x+1000<<"\n";     // Output : 0x7af786c852c0
     cout<<x-1000<<"\n";     // Output : 0x7af786c83380
     cout<<x*1<<"\n";        /* Output : invalid operands of types  
                           'int[5]' and 'int' to binary 'operator*' */
     cout<<x*2<<"\n"; 
     cout<<x++<<"\n";        /* Error :  lvalue required as increment 
                           operand */
     cout<<x--<<"\n";
     x=x;                    //Error : invalid array assignment
     cout<<x<<"\n";
     return 0;
 }

如果有人可以解释详细声明数组时会发生什么,那会更好。 以及为什么在所有算术运算中只有'+'和'-'无效而不是'*'或其他。

3 个答案:

答案 0 :(得分:2)

一些注意事项:

  1. int main替换为int main()(以正确声明函数)
  2. int x={2,3,4,5,6}替换为int x[]={2,3,4,5,6};(以正确声明数组)
  3. 数组不能递增,但可以对数组进行POINTERS。 (请参见下文)
  4. 我假设您要打印数组第一个元素的VALUE,而不是第一个元素的ADDRESS。
  5. 确保以分号终止所有行。
  6. 从技术上讲,main函数在成功完成后应该return 0

话虽如此,下面的代码应该可以做到这一点。

int main() {
    int *y, x[] = {2,3,4,5,6};
    y = x;
    cout << *y++;
    return 0;
}

现在,逐行检查

  1. 声明一个指向int(y)的指针,声明一个int数组(x),然后初始化该数组。
  2. y设置为等于x(即,将数组的地址存储在y中)。
  3. 取消引用y(即获取该地址处的整数值),打印出来,然后递增y指向x中的下一个元素。

答案 1 :(得分:1)

否,该变量不存储任何内容的地址;它存储了整个数组。

增加指针是有意义的,但是数组不是指针。

当你说

int x[] = {2,3,4,5,6};

你在记忆中得到的是

[ 2 ][ 3 ][ 4 ][ 5 ][ 6 ]

(连续5个整数)。 x是指整个事物;没有通过指针的间接访问。

答案 2 :(得分:1)

大多数数组包含无法递增或相乘的内容 因此增加或乘以数组对 一般情况。

有一个{很少使用的)std::valarray模板假定 元素是算术类型,并支持整体算术运算 数组:

#include <iostream>
#include <valarray>

int main()
{
    std::valarray<int> x = {2,3,4,5,6};

    x += 1;
    for (auto v : x) std::cout << v << " ";
    std::cout << "\n";

    x *= 2; 
    for (auto v : x) std::cout << v << " ";
    std::cout << "\n";
}

输出为:

3 4 5 6 7 
6 8 10 12 14