передача размера массива в функцию - PullRequest
3 голосов
/ 22 сентября 2011

..., вы должны передать в функцию размер массива. (Примечание. Другой практикой является передача указателя на начало массива и указателя на местоположение сразу за концом массива. Разница между двумя указателями заключается в длине массива, и полученный код проще.)

Я не мог написать коды для того, что говорится в заметке.Кто-нибудь может мне помочь?

Ответы [ 6 ]

8 голосов
/ 22 сентября 2011

Проблема в том, что если вы не можете передать массив в функцию.Когда вы делаете это, имя массива «распадается» на указатель на его первый элемент.Это означает, что вы больше не знаете размер этого массива, поскольку вы можете только передавать указатель на элемент в этом массиве.Таким образом, вы должны передать ему размер, чтобы функция, принимающая массив, знала, как долго он будет.элемент за концом массива:

void bar(unsigned char *array, unsigned char *end)
{
     while(array != end) {
       printf("%02X ", *array);
       array++;
    }
}

И вы называете это как

unsigned char data[] = {1,2,3,4};
foo(data,sizeof data); //same as foo(&data[0], siseof data);
bar(data, data + 4); //same as bar(&data[0], &data[4]);
1 голос
/ 22 сентября 2011

Примерно так:

int accumulate( int *first, int *last )
{
  int result = 0;

  for( ; first != last; ++first ) {
    result += *first;
  }

  return result;
}

int main()
{
  int arr[] = {1,2,3,4,5};
  int sum = accumulate( arr, arr + 5 );

  return 0;
}

Приведенный выше код суммирует все элементы в диапазоне [first, last);где first входит в диапазон и last исключается.Таким образом, вам нужно передать указатель на начало диапазона, который вы хотите суммировать, и еще один на одно место после последнего элемента, который вы хотите добавить к сумме.

1 голос
/ 22 сентября 2011

Предположим, у нас есть этот массив целых чисел:

#define CAPACITY 42
int foo[CAPACITY];

И эти две функции, которые его обрабатывают:

void func1(int* begin, int* end) {
    // Loop over the array
    while(begin < end) {
        int val = *begin++; // process element
    }
}

void func2(int* begin, int size) {
    // Loop over the array
    for(int i = 0; i < size; ++i) {
        int val = begin[i]; // process element
    }
}

Первая будет называться как func1(foo, foo + CAPACITY): передачав указателе на начало массива, и указатель чуть выше последнего элемента.

Второй будет называться как func2(foo, CAPACITY): передача указателя на начало массива и размер массива.

Из-за того, как работает арифметика указателей, обе версии эквивалентны.

0 голосов
/ 22 сентября 2011
 int A[] = {1,2,3,4,5,6,7,8,9,0};
 printf("Size of the Array %d \n", sizeof(A)/sizeof(int));//size of the array


you can use this value to function 

void getSize(int A[], size_t size){
//do somthing
}

void function()
{
//from where you call this 
 int A[] = {1,2,3,4,5,6,7,8,9,0};
 getSize(A, sizeof(A)/sizeof(int));
}
0 голосов
/ 22 сентября 2011

Если вы хотите передать только размер массива, вы можете передать в функцию следующее:

function(sizeof(array)/sizeof(array[0]));
0 голосов
/ 22 сентября 2011
void f(int* arr, int len) { ... }

void f(int* start, int* end) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...