Вот если надо передать массив или матрицу в функцию.
...
int f1(int a[][], int N, int M);//Тогда расход памяти увеличивается вдове.
// А вдруг нам надо получить значение в a[i][j] или вернуть -1 если a[i][j] находится вне матрицы M*N?
int f2((int a[][], int i, int j, int N, int M);//потребление памяти увеличивается уже в 3 раза!
//А вдруг у нас есть еще аналогичные f3, f4, f5, f6?
int main()
{
....
int a[N] [M];
int b;
b=f1(a[N][M], N, M);
....
}
//но ведь можно сделать так
int **a;
int f1(int **a, int N, int M);
int f2((int **a, int i, int j, int N, int M);
{
....
//Создаем матрицу N*M через malloc;
int b;
b=f1(a, N, M);
....
}
Другие языки программирования и технологии
Почему нельзя использовать глобальные переменные?
Потому что стили программирования оптимизируются по приниципу "у Вас программа может быть миллион строк, нужно писать ее так, чтоб было легко разобраться"
А откуда ты взял "int f1(int a[][], int N, int M);//Тогда расход памяти увеличивается вдОВе. "?
Память под массив резервируется только там, где он объявлен. В функцию передается адрес начала массива и его тип. Никакого "лишнего" расхода памяти нет!
Память под массив резервируется только там, где он объявлен. В функцию передается адрес начала массива и его тип. Никакого "лишнего" расхода памяти нет!
Ты напутал совершенно разные вещи. Все твои функции во всех случаях будут занимать одинаково памяти, потому что в C++ имя массива почти всегда (кроме sizeof) преобразуется в указатель на его нулевой элемент: arr == &arr[0]. Зато если сделать
struct A { int array[100];};
int func(A a);
то здесь действительно будет происходить выделение памяти и копирование структуры. Но этого можно избежать, передавая указатель (C/C++):
int func(A *a);
или ссылку (только C++):
int func(A &a);
А глобальные переменные не используют из-за побочных эфектов. Приведу пример из жизни: мне попадалась производственная программа, где все преобразования строк во всех функциях были вынесены в глобальный буфер char BUFFER[1024] (да, вот такой талантливый программист писал) . Ну так вот, в некоторых функциях этот буфер перед работой очищался, а в некоторых - нет, и понять по коду, что именно за чем выполнялось было практически невозможно: если в одной функции к буферу дописывалась строка с именем пользователя, то чтобы что-то в этой функции поменять, надо было проверить все ее вызовы и оценить, что находилось в буфере на тот момент. Представил объем работы?
struct A { int array[100];};
int func(A a);
то здесь действительно будет происходить выделение памяти и копирование структуры. Но этого можно избежать, передавая указатель (C/C++):
int func(A *a);
или ссылку (только C++):
int func(A &a);
А глобальные переменные не используют из-за побочных эфектов. Приведу пример из жизни: мне попадалась производственная программа, где все преобразования строк во всех функциях были вынесены в глобальный буфер char BUFFER[1024] (да, вот такой талантливый программист писал) . Ну так вот, в некоторых функциях этот буфер перед работой очищался, а в некоторых - нет, и понять по коду, что именно за чем выполнялось было практически невозможно: если в одной функции к буферу дописывалась строка с именем пользователя, то чтобы что-то в этой функции поменять, надо было проверить все ее вызовы и оценить, что находилось в буфере на тот момент. Представил объем работы?
1) глобальные переменные использовать можно, но лишь в крайнем случае, если без них не обойтись
2) память уже на байтами меряется, что надо экономить, сейчас упор - на читаемость и отладку
2) память уже на байтами меряется, что надо экономить, сейчас упор - на читаемость и отладку
можно, в некоторых случаях даже предпочтительнее.
почитайте что такое область видимости и указатели. Решение кроется там
Похожие вопросы
- [C++] Почему не рекомендуют использовать глобальные переменные?
- В каких случаях в Си надо использовать переменные static, а не глобальные переменные?
- Подскажите как решить используя динамические переменные ( С++)
- Как использовать значение переменной как ИМЯ переменой или метода,,,? С#
- Чем отличаются статические и глобальные переменные?
- Почему в этой программе переменная объявлена дважды? (C++, WinAPI)
- Почему человек использует десятизначную систему счисления, а компьютер двоичную?
- Исходная база Linux и Chromium, почему их используют?
- С# - нужно сделать так, чтобы консоль читала слова, как переменные, а не просто слова...
- Как сложить переменную ? Delphi 7 Что никто не знает ответа что ли ?Н