2017-01-11 7 views
-2

Я знаю, даже если я передаю массив, набрав arrayname в качестве аргумента (например: getArrayInput (arrayexample);), он скопирует только адресное значение первого элемента не полностью массив, все же мне интересно, почему этот код дает ошибку. Я знаю, что это не так, как это должно было быть реализовано, но я хочу понять эту ошибку.Передача указателя на массив int в качестве аргумента C++

main.cpp|13|error: cannot convert 'int*' to 'int**' for argument '1' to 'void getArrayInput(int**)'|

#include <iostream> 

using namespace std; 
void getArrayInput(int * []); 

int main() 
{ 
    cout<<"Enter scores on by one.." << endl; 
    cout<<"To terminate input enter -1"<<endl; 

    int listof[10]={}; 
    int *ptScores =listof; 
    getArrayInput(ptScores); 




    return 0; 
} 

void getArrayInput(int * []){ 
    for(int i=0;i<10;i++){ 
     cin>>*(pt+i); 
     if(*(pt+i))=-1){ 
      break; 
     } 
     else{ 
      cout<<"Enter next.."<<endl; 
     } 
    } 
} 
+7

Добро пожаловать на C++, где вы получите 'std :: vector ' без дополнительной оплаты. – Bathsheba

+0

Кстати, вы опасно близки к переполнению/вне границ записи. –

ответ

2

В C массивы распада и указателей. В некоторых случаях они взаимозаменяемы.

ptScores имеет тип int* (указатель на int). getArrayInput ожидает int*[] (массив указателей на int). int*[] распадается на int** (указатель на указатель на int).

Ошибка: вы указываете int* (ptScores) на то, что ожидает int** (getArrayInput).


Как вы это исправите? Возьмите int*.

void getArrayInput(int* pt){ 
    for(int i=0;i<10;i++){ 
     cin>>pt[i]; 
     if(pt[i]=-1){ 
      break; 
     } 
     else{ 
      cout<<"Enter next.."<<endl; 
     } 
    } 
} 
2

Это происходит потому, что

int * 

и

int[] 

оба типа

int * 

theref руды, вы здесь просить

int **. 

попробуйте заменить

void getArrayInput(int * []) by  void getArrayInput(int *)