将一个int数组复制到另一个C ++

时间:2018-04-08 13:18:27

标签: c++ arrays pointers global-variables

尝试编写一个程序,将值从一个指定的数组转换为另一个未指定的数组。我写的代码:

#include "stdafx.h";
#include <iostream>;

using namespace std;

int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int j[10];

int copy_array(int *p1, int n);
int *p2, *p2;

int main() {

    for (int l = 0; l < 10; l++) {
        cout << a[l] << endl;
    }

    copy_array(a, 10);

    for (int i = 0; i < 10; i++) {
        j[i] = &p2;
        cout << j[i] << endl;
    }

    system("PAUSE");
    return 0;
}

int copy_array(int *p1, int n) {
    while (n-- > 0) {
        *p1 = *p2;
            *p1++;
        *p2++;
    }
}

我正在使用Microsoft visual studio平台,我得到的错误是“没有可以进行此转换的上下文”。为什么我不能使用这个int转换路径?如何使用int类型转换修复和连接2个数组(如果可能的话)?

我试过操作本地函数copy_array所以它使用j [10]数组整数的地址进行转换,但这给了我另一个错误。任何支持和建议将不胜感激。

3 个答案:

答案 0 :(得分:0)

您不需要p2是全球性的。

只需将参数添加到copy_array

像这样:

void copy_array(int *p1, int *p2, int n) {
    while (n-- > 0) {
        *p1 = *p2;
        p1++;
        p2++;
    }
}

并且这样打电话:

copy_array(j, a, 10);

另外:打印你刚刚复制的副本:

 for (int i = 0; i < 10; i++) {
        cout << j[i] << endl;
    }

答案 1 :(得分:0)

以下是您的代码的一些注释:

  1. 您有多余的p2声明:int *p2, *p2;。您还需要初始化它。所以吧:int *p2 = j;(事实上,你实际上并不需要使用这个全局变量 - 你可以根据需要传递j来达到同样的效果。)
  2. 在复制功能中,您的作业应该是相反的: *p2 = *p1;不是*p1 = *p2; - 右侧分配到左侧。
  3. 打印j时,您不需要j[i] = &p2;来改变j的内容。
  4. 最好在函数内部定义不在一般范围内的数组。
  5. 纠正它们,你的代码应该可以正常工作。

    但是,您根本不需要指针。

    请考虑以下代码并将其与您的代码进行比较:

    #include <iostream>
    using namespace std;  
    
    void copy_array(int [], int [], int);
    void print_array(int [], int);
    
    int main() {
    
        int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        int j[10];
    
        print_array(a,10);
        copy_array(a, j, 10);
        print_array(j,10);
        return 0;
    }
    
    void copy_array(int s[], int d[], int n) {
        for (int i = 0; i < n; i++)
            d[i] = s[i];   
    }    // s for source & d for destination
    
    void print_array(int arr[], int n) {
        for (int i = 0; i < n; i++)
            cout << arr[i] << " ";
        cout << "\n\n";
    }
    

答案 2 :(得分:0)

我希望以@ Shadi的答案为基础,你应该投票,并使代码更加C ++ - 惯用。

  • 在C ++中,我们不需要从main明确return 0;;如果你还没有归还其他任何东西,那就暗示了。
  • 在类似的方案中使用类似变量的名称会更好。具体而言,ij是整数标量的公共变量名,例如计数器 - 不是数组。我建议您对数组使用ab,或valuescopy_of_values等。
  • C ++标准库有一个类似于数组的容器类,名为std::vector。它与数组不完全相同;例如,它使用动态分配的内存,并且可以增大或缩小。您可能想要使用它的原因是它允许您执行普通分配,并使用其他标准库工具。

因此Shadi的节目变成了:

#include <iostream>
#include <vector>

void print_vector(const std::vector<int>& vec);

int main() {
    std::vector<int> a { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    std::vector<int> b;

    print_vector(a);
    b = a;
    print_vector(b);
}

void print_vector(const std::vector<int>& vec) {

    // this next line uses syntax from the 2011 version of
    // the C++ language standard ("C++11").
    for(int x : vec) {
        std:cout << x << " ";
    }
    cout << "\n\n";
}
  • 您还可以使用std::for_eachstd::for_each_n完全避免print_vector中的循环,但这需要一些迭代器和lambda函数的知识,这对于初学者,所以我不会进入那个。但更好的是,您可以为std::vector定义一个外流式运算符,如here所示,您可以使用std::cout << a;编写private static int[] print(int[] lemons) { for(int k = 0; k < lemons.length; k++) { System.out.print(lemons[k] + " "); } return lemons; } 并使其工作。