为什么在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;
}
如果有人可以解释详细声明数组时会发生什么,那会更好。 以及为什么在所有算术运算中只有'+'和'-'无效而不是'*'或其他。
答案 0 :(得分:2)
一些注意事项:
int main
替换为int main()
(以正确声明函数)int x={2,3,4,5,6}
替换为int x[]={2,3,4,5,6};
(以正确声明数组)main
函数在成功完成后应该return 0
。话虽如此,下面的代码应该可以做到这一点。
int main() {
int *y, x[] = {2,3,4,5,6};
y = x;
cout << *y++;
return 0;
}
现在,逐行检查
y
)的指针,声明一个int数组(x
),然后初始化该数组。y
设置为等于x
(即,将数组的地址存储在y
中)。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