Невозможно преобразовать int (*) [5] в int * - PullRequest
0 голосов
/ 03 августа 2020

Когда я пытался получить доступ к элементам массива с помощью указателя, я получил эту ошибку, я не понимаю, как я могу получить доступ с помощью указателя.

Error: cannot convert ‘int (*)[5]’ to ‘int*’ for argument ‘1’ to ‘void addd(int*, int)

Любые указания по вопрос был бы очень признателен!

#include <iostream>
using namespace std;

    void addd(int *ptr,int length)
    {
       cout<<"The values in the array are: ";
       for(int i = 0; i < length; i++) {
          cout<< *ptr <<" ";
          ptr++;
       }
    }
    
    
    int main() {
       int arr[5] = {1, 2, 3, 4, 5};
       
       addd(&arr,5);
       
       //int *ptr = &arr[0];
       return 0;
    }

Ответы [ 4 ]

4 голосов
/ 03 августа 2020

Ваша функция получает указатель на int, поэтому вам нужно просто передать адрес первого элемента.

Вы можете сделать это:

addd(&arr[0],5);

или просто:

addd(arr,5);
2 голосов
/ 03 августа 2020

Вы делаете это неправильно. &arr означает int (*)[5], но вы используете int *ptr. Итак, вы должны использовать, как показано ниже:

addd(arr, 5); // this is correct
// addd(&arr, 5) // this is wrong

Здесь arr передается как int *

1 голос
/ 03 августа 2020

Когда вы передаете массив в функцию, например:

addd(arr,5);

, тогда массив неявно преобразуется в указатель на свой первый элемент, int*. Вместо того, чтобы полагаться на неявное преобразование, вы можете сделать его явным:

addd( &arr[0],5);
   //      ^-  first element
   // ^------  address-of first element

Однако массивы не являются указателями, и получение адреса массива дает указатель на массив:

using pointer_to_array = int (*)[5];
pointer_to_array p = &arr;
0 голосов
/ 03 августа 2020

массивы и указатели в значительной степени взаимосвязаны друг с другом. По умолчанию массив указывает на адрес первого элемента, то есть на элемент с индексом 0. Таким образом, работа с массивами и указателями в значительной степени одно и то же (не каждый раз). Таким образом, вам не нужно передавать массив как

addd(&arr,5);

, вам просто нужно просто

addd(arr,5);

Кроме того, я скажу, что оператор addd(&arr[0],5); выполняет свою работу, но это не лучший способ продолжить.

...