Хорошо, это просто соглашение, которое выбрал язык C-программирования. C ++ унаследовал его от C.
Вы привели два разных, но несколько связанных примера. Я собираюсь обратиться к ним отдельно.
Для второго примера : Например, когда вы объявляете переменную int a
- машине нужно где-то хранить значение. То есть имеется определенный объем ОЗУ, выделенный для хранения значения, которое можно интерпретировать как int
. на 32-битной машине x86 - это должно быть 32 бита / 4 байта памяти.
Когда функция вызывается с аргументами - значения должны быть переданы функции. Это значит, что для хранения этих значений должна быть выделена некоторая память. C и C ++ решили скопировать значения по умолчанию. Это первое, что происходит при вызове функции - выделение некоторой памяти. его аргументы и значения копируются в эту новую память. Это хорошо работает для целых, так как они могут храниться в регистрах процессора - которые ограничены по размеру. Если вы хотите изменить значения - вам нужно взять адрес памяти, в которой хранится значение, - передать этот адрес функции. Обратите внимание, что вы скопировали адрес. Но наличие адреса - указателя - позволяет вам изменять значения, хранящиеся по этому адресу.
// Copy two integers
void interChange(int a, int b) {
int tmp;
tmp = a;
a = b;
b = tmp;
}
void interChangePtr(int* a, int* b) {
int tmp;
tmp = *a;
a* = *b;
b* = tmp;
}
int main() {
int a = 5, b = 3;
interChange(a, b);
// a=5, b=3.
interChangePtr(&a, &b);
// a=3, b=5
return 0;
}
Что касается вашего второго примера - это еще одно соглашение, выбранное C
. Когда вы набираете:
int main() {
int arr[25]; // Allocates memory on the stack for 25 integers
...
Объявление массива (в стиле C) сообщает компилятору, что вы хотите, чтобы он выделил память для вашего массива в стеке. Массив - это просто непрерывный кусок памяти. Таким образом, вы можете взять указатель на него и изменить значения, используя этот указатель. А в C
, если вы наберете arr
- это указатель на память, выделенную вам в стеке. Поэтому, когда вы вызываете функцию void function(int arr[])
как function(arr)
- это фактически передает указатель на ваш массив, а не на реальный блок памяти. Причина этих условностей - это производительность. Проще передать единственный указатель на массив, чем выделить новый массив и скопировать данные.
Надеюсь, это даст вам некоторый указатель для дальнейшего изучения темы.