代码之家  ›  专栏  ›  技术社区  ›  Mabadai

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

  •  1
  • Mabadai  · 技术社区  · 6 年前

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

    #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类型转换修复和连接这两个数组(如果可能的话)?

    我尝试的是操作本地函数copy\u array,以便使用j[10]数组整数的地址进行转换,但这给了我另一个错误。如有任何支持和建议,将不胜感激。

    3 回复  |  直到 6 年前
        1
  •  3
  •   Shadi    6 年前

    以下是代码的一些注释:

    1. 你有多余的 p2 声明: int *p2, *p2; 。您还需要对其进行初始化。所以,让它: int *p2 = j; (事实上,您实际上不需要使用这个全局变量-您可以通过传递 j 如有必要)。
    2. 在复制函数中,您的赋值应相反: *p2 = *p1; *p1 = *p2; -右侧指定给左侧。
    3. 打印时 J ,您不需要 j[i] = &p2; 这改变了 J 的内容。
    4. 最好在函数内定义数组,而不是在一般范围内。

    更正它们,您的代码就会正常工作。

    但是,您根本不需要指针来完成此操作。

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

    #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
  •  2
  •   SHR    6 年前

    您不需要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;
        }
    
        3
  •  2
  •   einpoklum    3 年前

    我想在@Shadi的答案的基础上进行构建,您应该对此进行投票,并使代码更具C++风格。

    • 在C++中,我们不需要显式地 return 0; 来自main;这意味着,如果您没有返回任何其他内容。
    • 对于类似的变量,最好在类似的方案中使用名称。明确地 i j 是整数标量的常见变量名,例如计数器,而不是数组。我建议你使用 a b 对于阵列,或 values copy_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 << " ";
        }
        std::cout << "\n\n";
    }
    
    • 您还可以避免中的循环 print_vector 完全,使用 std::for_each std::for_each_n ,但这需要一些迭代器和lambda函数的知识,这对于初学者来说可能有点高级,所以我将不深入讨论。但更好的是,您可以为 标准::矢量 如图所示 here ,您可以使用 std::cout << a; 还有那份工作。