2010-04-07 3 views
4

Я нашел этот код, и я не уверен, что произойдет перегрузка или нет.Перегрузка функций

void print(int (*arr)[6], int size); 

void print(int (*arr)[5], int size); 

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

любой поток будет полезным.

ответ

6

KennyTM's answer является правильным. Вот еще одна мысль, однако, исходя из того, что ваш вопрос приходит с тегом C++. В C++, вы можете использовать шаблоны с аргументами нетиповых выяснить размеры массива:

#include <iostream> 

template< std::size_t N > 
void print(int (&arr)[N]) {std::cout << N << '\n';} 

int main() 
{ 
    int arr[6]; 
    print(arr); 
    return 0; 
} 
+1

Нет, 'int (* x) [n]' является указателем на 'int [n]'. – kennytm

+0

Вы правы, конечно. Я забыл о '*'. Я должен обратить больше внимания. – sbi

10

Перегрузки будет, и передавая указатель на массив из 4-х int не будет соответствовать либо функции. Это понятнее, если вы пишете их эквивалентном виде:

void print(int arr[][6], int size); 
void print(int arr[][5], int size); 

N × 4 Массив может быть распались на указатель на массив из 4-х int. И хорошо известно, что 2D-массивы, имеющие разные 2-мерные измерения, несовместимы.

1

Звонок будет неоднозначным, поскольку ни одна из двух перегрузок не сможет конвертировать в int (*arr)[4]. Вам нужно передать элемент из 5 или 6 элементов явно.

VS2008 дает:

error C2665: 'print' : none of the 2 overloads could convert all the argument types 
(2088): could be 'void print(int (*)[5],int)' 
(2093): or  'void print(int (*)[6],int)' 
while trying to match the argument list '(int (*)[4], int)' 

Надежда, что помогает.