2016-11-23 145 views
-1

我是一年级学生,也是编程新手。我被要求写一个函数,它可以将数组值与其索引进行交换。 EG如果数组:[4,3,0,5,1,2]然后O/P:array [4] = 0,数组[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我想从错误中学习,所以请告诉我缺少什么基础知识。

+0

他们希望你把什么'array [0]'?选择是'2'和'5'。 – dasblinkenlight

+0

你的函数是'swaparr(int,int)',但是你传递一个数组和一个'int'。那不匹配。同样,对于'return b;'''b''不是一个int,而是几个'int's。 –

+0

_'int b [len];'_变长数组无效C++。 –

回答

0
  1. 返回任何局部变量的地址是非常危险的。 (对于 例如,返回数组b的第一个元素, 你试图做的地址)
  2. 阵列是从指针不同,虽然隐式转换可以 来执行,当你试图分配一个阵列到指针(或 用数组初始化指针)。实际上,指针 将存储阵列中第一个元素的地址,并且在转换期间该阵列的长度为 会丢失。
  3. 你不能复制构造一个数组与另一个数组(类似于 int arr [10] = foo(),其中foo将返回一个数组类型,而不是 可能)。或者将一个数组分配给另一个。但是您可以返回 对数组的引用,这是另一个故事。
  4. 您最好从书本上学习这些知识,而不是阅读由不擅长英语的人编写的 答案。

我已经用尽可能少的更改更正了您的代码。

#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. 而不是返回的数组或一个地址的,我制备在 功能主阵列,和把它传递给功能swaparr,和swaparr将 结果写入到这个阵列。
  2. 不能简单地要求std :: cout来打印一个数组,你必须打印 它是一个又一个的元素。
  3. 当您完成打印后,不要忘记打印一个endl。 (总是)
+0

非常感谢你的努力。你的代码可以帮助我理解我在做什么错误。 –