为什么在C++中,声明为数组的变量可以用整数加减,但不能递增(++(或递减(--(或乘以数字等,即使变量存储数组的起始地址? 例如
#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;
}
如果有人能解释详细声明数组时会发生什么,那就更好了。 以及为什么在所有算术运算中只有"+"和"-"有效,而不是"*"或其他。
需要注意的几点:
- 将
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;
}
现在,逐行检查此内容
- 声明一个指向 int (
y
的指针 (,声明一个 int 数组 (x
(,然后初始化该数组。 - 将
y
设置为等于x
(即将数组的地址存储在y
中(。 - 取消引用
y
(即获取该地址处整数的值(,打印它,然后递增y
指向x
中的下一个元素。
不,变量不存储任何内容的地址;它存储整个数组。
递增指针是有意义的,但数组不是指针。
当你说
int x[] = {2,3,4,5,6};
你在记忆中得到的是
[ 2 ][ 3 ][ 4 ][ 5 ][ 6 ]
(连续 5 个整数(。x
指的是整个事情;没有通过指针或任何东西的间接寻址。
大多数数组包含不能递增或相乘的东西 因此,递增或乘以数组没有任何意义 一般情况。
有(很少使用(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