Как создать указатель на размер массива?

Вот есть такие задание
Написать функцию, которая получает указатель на массив и его размер
И я не понимаю как сделать это указатель на размер массива

Я пытаюсь вот так

#include <iostream>
void RandArr(int*, const int*);

void SumArr(int*, const int*, int*);

void MultArr(int*, const int*, long*);

void OutputArr(int*, const int*);


int main(void) {

const int size5 = 5;
int arr[size5];
long mult = 1;
int sum = 0;
srand(time(0));

RandArr(arr, *size5);
OutputArr(arr, *size5);

SumArr(arr, *size5, &sum);
MultArr(arr, *size5, &mult);

}

void RandArr(int* arr, const int* size) {
//body
}

Пишут что нельзя сохранить в указатель значение а только адрес с значением

А когда пытаюсь так

#include <iostream>

void RandArr(int*, const int*);

 

void OutputArr(int*, const int*);

 

 

int main(void) {

 

       const int size5 = 5;

       const int* psize5 = &size5;

       int arr[size5];

       long mult = 1;

       int sum = 0;

       srand(time(0));

 

       RandArr(arr, &size5);

       OutputArr(arr, &size5);

 

 

}

 

void RandArr(int* arr, const int size) {

       for (int i = 0; i < size; i++) {

             arr[i] = rand() % 21;

       }

}

 

void OutputArr(int* arr, const int size) {

       for (int i = 0; i < size; i++) {

             cout<<arr[i] << " ";

       }

}

То у меня спецификация прототипов не совпадает со спецификацеией функции также делать указатель на простую целочисленную переменную бессмысленно

И всё таки как же мне тогда создать этот массив и указатель на его размер?


Ответы (3 шт):

Автор решения: Igor

... получает

  1. указатель на массив и
  2. его размер

Слово "указатель" относится только к слову "массив".

→ Ссылка
Автор решения: Сергей Симонов

Чтобы получить указатель на переменную надо просто взять адрес этой переменной c помощью оператора &.

void RandArr(int*, const int *);
// ...
const int size = 5; // переменная
const int* size_ptr = &size; // указатель на переменную
int data[size] = {};
RandArr(data, size_ptr); // можно вызывать так
RandArr(&data[0], &size); // так тоже можно вызывать

В вашем коде функция "void RandArr(int*, const int*)" имеет тип второго аргумента константный указатель на int. Когда Вы делаете такой вызов "RandArr(arr, *size5)", то происходит попытка разыменовать целую константу size5. Это не работает, так как size5 - не указатель. Второй вариант Вашего кода имеет разную сигнатуру в объявлении и реализации функции RandArr.

В вашем задании, размер массива не обязательно передавать через указатель. Тогда код будет выглядеть так.

void RandArr(int* arr, const int size) {
       for (int i = 0; i < size; i++) {
             arr[i] = rand() % 21;
       }
}

// ......

const int size = 5; 
int data[size] = {};
RandArr(data, size); 
→ Ссылка
Автор решения: Mikhail Nekrasov

У вас стандартная задача по передаче массива в функцию. В любой литературе решения описаны. Самый тривиальный — это передача указателя на массив и количества элементов массива.

Например:

int foo(int* buf, int size);
→ Ссылка