Как вы получаете размер массива, который передается в функцию? - PullRequest
8 голосов
/ 06 октября 2010

Я пытаюсь написать функцию, которая распечатывает элементы в массиве.Однако, когда я работаю с переданными массивами, я не знаю, как выполнять итерацию по массиву.

void
print_array(int* b)
{
  int sizeof_b = sizeof(b) / sizeof(b[0]);
  int i;
  for (i = 0; i < sizeof_b; i++)
    {
      printf("%d", b[i]);
    }
}

Какой лучший способ выполнить итерацию по переданному массиву?

Ответы [ 6 ]

16 голосов
/ 06 октября 2010

Вам также необходимо передать размер массива в функцию.
Когда вы передаете массив своей функции, вы действительно передаете адрес первого элемента в этом массиве. Таким образом, указатель указывает на первый элемент только один раз внутри вашей функции.

Поскольку память в массиве непрерывна, вы все равно можете использовать арифметику указателей, например (b+1), для указания на второй элемент или эквивалентно b[1]

void print_array(int* b, int num_elements)
{
  for (int i = 0; i < num_elements; i++)
    {
      printf("%d", b[i]);
    }
}

Этот трюк работает только с массивами, а не с указателями:

sizeof(b) / sizeof(b[0])
Массивы

... и не совпадают с указателями .

5 голосов
/ 06 октября 2010

Почему вы не используете шаблоны функций для этого (C ++)?

template<class T, int N> void f(T (&r)[N]){
}

int main(){
    int buf[10];
    f(buf);
}

РЕДАКТИРОВАТЬ 2:

Похоже, что qn теперь имеет тег C и тег C ++ удален.

2 голосов
/ 06 октября 2010

Для C вы должны передать длину (количество элементов) массива.

Для C ++ вы можете передать длину, НО, если у вас есть доступ к C ++ 0x, ЛУЧШЕ использовать std::array. См. здесь и здесь . Он имеет длину и обеспечивает проверку на выход за пределы допустимого при доступе к элементам с помощью функции-члена at().

0 голосов
/ 06 октября 2010

В c ++ вы также можете использовать некоторый тип класса списка, реализованный в виде массива с методом размера или в виде структуры с членом размера (в c или c ++).

0 голосов
/ 06 октября 2010

В C99 вы можете потребовать, чтобы массив, массив, имел как минимум n элементов, таким образом:

void print_array(int b[static n]);

6.7.5.3.7 : объявление параметра как «массива типа» должно быть скорректировано на «квалифицированный указатель на type ’’, где квалификаторы типа (если таковые имеются) - это те, которые указаны в [и] вывод типа массива. Если ключевое слово static также появляется в пределах [и] вывод типа массива, затем для каждого вызова функции значение соответствующего фактический аргумент должен обеспечивать доступ к первому элементу массива с как минимум элементы, указанные в выражении размера.

В GCC вы можете неявно передавать размер массива следующим образом:

void print_array(int n, int b[n]);
0 голосов
/ 06 октября 2010

Вы можете попробовать это ...

#include <cstdio>                                                               

void 
print_array(int b[], size_t N) 
{ 
    for (int i = 0; i < N; ++i) 
        printf("%d ", b[i]);
    printf("\n");
}

template <size_t N>
inline void 
print_array(int (&b)[N]) 
{
    // could have loop here, but inline forwarding to
    // single function eliminates code bloat...
    print_array(b, N);
}                                                                                

int main()                                                                      
{                                                                               
    int a[] = { 1, 2 };                                                         
    int b[] = { };
    int c[] = { 1, 2, 3, 4, 5 };                                                

    print_array(a);                                                             
    // print_array(b);                                                          
    print_array(c);                                                             
}

... интересно, b не работает ...

array_size.cc: In function `int main()':
array_size.cc:19: error: no matching function for call to `print_array(int[0u])'

JoshD указывает в комментариях под вопросом о 0размерные массивы (расширение GCC) и вывод размера выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...