2017-02-01 1 views
-3

Я должен объяснить этоC++ массив и метод

void m(int, int[]); 

int main() 
{ 
    int x = 1; 
    int y[10]; 
    y[0] = 1; 

    m (x, y) 
    cout >> x >> endl; 
    cout >> y >> endl; 

    return 0; 
} 

void m (int num, int nums[]) 
{ 
    num = 100; 
    nums[0] = 1000; 
} 

Выход из х и у

х еще 1, но у заменяется на 1000

Я не знайте, почему это произошло.

Почему целочисленный массив y [0] заменен, в то время как целое число x равно 1?

+0

Если вы собираетесь изучить C++, вам нужно будет начать использовать контейнеры стандартной библиотеки, такие как ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector), а не массивы фиксированной длины C-стиля. Также вы проходите по значению, поэтому изменения локальны по объему. – tadman

+0

В какой книге вы изучаете C++, это не объясняет это? –

+1

'm (x, y) cout' является синтаксической ошибкой. Проверьте, что вы отправили точный код, который вы компилируете. –

ответ

1

Хорошо давайте посмотрим:

void m (int num, int nums[]) 
{ 
    num = 100; 
    nums[0] = 1000; 
} 

(. Следующее объяснение упрощено) Вы можете увидеть, что num простой параметр, и поэтому его value отдается функции, которая на самом деле является копией исходная переменная. Это называется по умолчанию. Независимо от того, что вы делаете с переменной в своей функции, она будет изменять только локальную копию, но не переменную исходной переменной.

В качестве справочника используется переменная tho nums. (Обратите внимание, что в сигнатурах функций термин int nums[] эквивалентен int* nums.) Вы не даете значение (копию) функции, а ссылку в виде указателя. Вот почему это называется call-by-reference. Если вы изменяете эту переменную, исходное значение изменяется (потому что вы передали только указатель (на самом деле это не ссылка)).

Чтобы получить дополнительную информацию, я предлагаю вам взглянуть на некоторые книги на C++, потому что это очень простая концепция, которую вы должны понимать, если хотите продолжить программирование (с помощью C++). Например, отправной точкой будет cplusplus.com.

+1

«Вы не указываете значение (копию) функции, а ссылку« На самом деле, указатель, указатели на C++ и ссылки - это две разные вещи. И cplusplus.com - отличный сайт для рекомендаций. –

+0

Спасибо. Я совершенно новый на C++, поэтому я, вероятно, пропустил этот важный момент: D – Konorika

+0

@NeilButterworth: Вы правы, спасибо, что указали это. Конечно, я не имел в виду ссылку, но я хотел использовать термин для более позднего использования именования «вызов по ссылке». Я отредактировал свой ответ. –

Смежные вопросы