我有以下任务: 创建一个程序,按以下顺序将数组A转换为数组B: http://gyazo.com/29e434ebdc1e235fe0fc97c26ae9fe9c
用户输入A的大小以及元素。打印B.“使用指针”的新元素
示例:如果我输入1234567,程序将输出8888888。
这是我的代码:
#include <iostream>
using namespace std;
int main()
{
int N;
cout << "Enter the size of array" << endl;
cin >> N;
int A[N], B[N];
cout << "Enter the elements of the array" << endl;
for(int i = 0; i < N; i++){
cin >> A[i];
}
for(int i = 0; i < N; i++){
B[i] = A[i] + A[N-i-1];
}
for(int i = 0; i < N; i++){
cout << B[i] << " ";
}
return 0;
}
我只有一个问题,它说“使用指针”,但我不知道我应该在哪里使用它们并且必须使用它们......提前感谢。
答案 0 :(得分:2)
int A[N], B[N];
此代码是非标准的(当N
是变量时)。您的编译器允许这样做,但如果您尝试在其他代码中编译此代码,则可能无法正常工作。
在这种情况下使用指针意味着您应该动态地为数组分配内存,例如
int * A, * B;
A = new int[N];
B = new int[N];
此代码在C ++标准方面有效。
请记住,您不必再需要手动释放已分配的内存:
delete[] A;
delete[] B;
这应该可以使代码的其余部分保持不变,因为[]
运算符也适用于指针。
最后,如果您真的在编写C ++程序,那么您肯定应该使用std::vector
而不是C风格的数组......
编辑:(回应评论)
如果以下列方式声明变量:
int * A;
然后写:
cin >> *(A + i);
这意味着:
i
“步骤”(它实际上从A走“i * sizeof(*A)
个字节”。但是当你宣布:
int (*A)[N];
A成为指向N个元素数组的指针。由于数组可以转换为指向其第一个元素的指针,因此您可以将前一行(为了便于解释)视为
int ** A;
在这种情况下,编译器尝试执行与之前描述的相同的操作。但现在它从A开始i
指针,而不是* int * s。然后它取消引用指针获取int *
并尝试将用户写入的数据放入其中。但是>>
的{{1}}运算符无法将文本转换为指针,这就是编译器抱怨的原因。
脚注
在学习使用指针时,您可能会认为cin
等于<something> variable[]
指向该数组的第一个元素。这是一个谎言(因为数组不是一个指针,但它是 convertible 指向其第一个元素的指针),但有助于理解什么是数组与指针有共同之处。这就是你能想到的原因
<something> * variable
作为
int (* A)[];
答案 1 :(得分:2)
好吧,这个
cin >> N;
int A[N], B[N];
无效ANSI C ++。您不能声明具有变量索引的数组。所以你需要一种声明变长数组的方法,一种方法是使用new [](然后删除[])来使用指针和动态分配的内存。
另一种更好的方法是使用诸如std :: vector之类的容器。