使用数组索引交换数组值

时间:2016-11-23 18:31:27

标签: c++ arrays function

我是一名一年级学生,也是编程新手。我被要求编写一个可以将数组值与其索引交换的函数。 E.G if array:[4,3,0,5,1,2]则O / P:array [4] = 0,array [3] = 1等等..

这是我的代码:

#include <stdio.h>
#include<iostream>
using namespace std;

int swaparr(int arr, int len){
    int b[len];
    int k;
    for(int i=0; i<len; i++){
        k=arr[i];
        b[k]=i;
    }
    return b;
}
int main()
{
    int arr[6]={4, 3, 0, 5, 1, 2};
    cout<<swaparr(arr, 6);
    return 0;
}

我收到错误:

prog.cpp: In function 'int* swaparr(int, int)':
prog.cpp:9:16: error: invalid types 'int[int]' for array subscript
         k=arr[i];
                ^
prog.cpp:6:9: warning: address of local variable 'b' returned [-Wreturn-local-addr]
     int b[len];
         ^
prog.cpp: In function 'int main()':
prog.cpp:17:25: error: invalid conversion from 'int*' to 'int' [-fpermissive]
     cout<<swaparr(arr, 6);
                         ^
prog.cpp:5:6: note: initializing argument 1 of 'int* swaparr(int, int)'
 int *swaparr(int arr, int len){
      ^

请解释我的错误。 P.S我想从错误中吸取教训,所以请告诉我我缺少的基础知识。

1 个答案:

答案 0 :(得分:0)

  1. 返回任何局部变量的地址非常危险。 (对于 例如,返回数组b的第一个元素的地址, 你试图这样做)
  2. 数组与指针不同,但隐式转换可能会有所不同 当您尝试将数组指定给指针时执行(或 用数组初始化指针)。实际上,指针会 存储数组的第一个元素的地址和长度 在转换过程中,数组丢失了。
  3. 你不能用另一个数组复制构造数组(类似于 int arr [10] = foo(),其中foo将返回数组类型,而不是 可能的)。或者将数组分配给另一个。但你可以回来 对数组的引用,这是另一个故事。
  4. 你最好从书本中学习这些知识,而不是阅读 由不擅长英语的人写的答案。
  5. 我已尽可能减少更改代码。

    #include <stdio.h> 
    #include <iostream>
    using namespace std;
    
    void swaparr(int *arr, int len, int *output){
        int k;
        for(int i=0; i<len; i++){
            k=arr[i];
            output[k]=i;
        }
    }
    
    int main()
    {
        int arr[6]={4, 3, 0, 5, 1, 2};
        int swapped[6]={0};
    
        swaparr(arr,6,swapped);
        for (int i=0; i<6; ++i)
          cout << swapped[i] << " ";
        cout << endl;
        return 0;
    }
    
    1. 我没有返回数组或地址,而是准备了一个数组 函数main,并将其传递给函数swaparr,而swaparr将 将结果写入此数组。
    2. 一个人不能简单地要求std :: cout打印一个数组,你必须打印 它是一个接一个的元素。
    3. 完成打印后,请不要忘记打印endl。 (总是)