powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача массивов в функции
73 сообщений из 73, показаны все 3 страниц
Передача массивов в функции
    #38539510
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Хотел динамическое выделять памяти для массивов вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	int* array;
	int array_i, array_j;
	cout << "Enter array count:";
        cout << "i:"; cin >> array_i;
        cout << "j:" ; cin >> array_j;
        cout << endl;
	
        array = new int[array_i,array_j];



Теперь как можно отправить этого массива в функции?
Мой вариант так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
#include <iostream>
using namespace std;

void add_mas(int mas[][], int mas1[][]);

int main()
{
	int* array;
        int* array1;
	int array_i, array_j;

	cout << "Enter array count:";
        cout << "i:"; cin >> array_i;
        cout << "j:" ; cin >> array_j;
        cout << endl;
	
        array = new int[array_i,array_j];
        array1 = new int[array_i,array_j];
	
	for (int i=0; i<=array_i; i++)
	{
		for (int j=0; j<=array_j; j++)
		{
			array[i,j] = 1;
			array1[i,j] = 2;
		}	
    }
    
    add_mas(array, array1);
    
    return 0;
}

void add_mas(int mas[][], int mas1[][])
{
	// операция с массивами
}


Как можно правильно организовать эту задачу? И еще как можно организовать возвращение массивов из функции?
Заранее спасибо!
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539597
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

Так у тебя всё правильно написано, в чём проблема-то ?

Хотя двумерные массивы не будут так легко работать, на сколько я помню.
Т.е. в функции тебе придётся вычислять смещения в массиве руками.
Ну, и если размерности массивов переменные, тебе нужно передавать и их.
Так что я бы объявлял функцию так:

Код: plaintext
1.
void add_mas( int mas[], size_t m, size_t n, int mas1[], size_t m1, size_t n1 );
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539644
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
Я ценю вашего мнении, но в этом случае функция не примут аргумент, так как определена одномерный массив, а отправляется двухмерный массив.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539665
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

При передаче массивов любой размерности реально передаётся только указатель на первый элемент передаваемого массива.
И при этом ему пофигу какая там размерность массива.

Кстати, ты бы указал дополнительно, какой язык ты используешь -- C или C++...
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539666
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя я могу про массивы что-то путать, поверь, очень редко в С++ используются многомерные массивы.
Я перепроверю.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539669
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
Да конечно, многомерные массивы может редко используются. Но это не значит, что на мой задачи нет решения!.
P.S. Использую С++, компилятор Dev C++.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539670
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlimkulovMasterZiv,
Да конечно, многомерные массивы может редко используются. Но это не значит, что на мой задачи нет решения!.В С++ предпочитают использовать объекты хранящие списки (list, vector и подобные). Массивы напрямую предпочитают не использовать вообще.

AlimkulovP.S. Использую С++, компилятор Dev C++.Это у тебя текстовый редактор Dev C++. А компилятор скорее всего GNU C++ из пакета MinGW.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539683
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlAlimkulovMasterZiv,
Массивы напрямую предпочитают не использовать вообще.

Я с Вами не соглашаюсь!
Массивы - это полезный тип данных, используемый в различных ситуациях.

AlimkulovP.S. Использую С++, компилятор Dev C++.Это у тебя текстовый редактор Dev C++. А компилятор скорее всего GNU C++ из пакета MinGW.
Да именно так!
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539801
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

вся штука в том, что у тебя создается видимость, что ты работаешь с двухмерными массивами.

вот ты пишешь

Код: plaintext
1.
new int[array_i,array_j];



а на самом деле эта запись означает

Код: plaintext
1.
new int[array_j];



далее ты пишешь

Код: plaintext
1.
array[i,j] = 1;


а на самом деле это

Код: plaintext
1.
array[j] = 1;


мистика? нисколько, всего лишь оператор запятая.

Итого, все твои потуги тщетно провалились.

Но, ты всегда можешь работать с одномерными массивом как многомерным:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
        int* array;
	int array_i, array_j;
	cout << "Enter array count:";
        cout << "i:"; cin >> array_i;
        cout << "j:" ; cin >> array_j;
        cout << endl;
	
        array = new int[array_i * array_j]; //  выделили память под двумерных массив
	
	for (int i=0; i<array_i; i++) // здесь обрати внимание на условие выхода!!!
	{
		for (int j=0; j<array_j; j++) // здесь обрати внимание на условие выхода!!! 
		{
			array[ i*array_j + j ] = 1;
		}	
        }
        delete [] array;



Ну, а чтобы выделить память под одномерный массив имитирующий двухмерный в функции, ничего особенного придумывать не надо:

Код: plaintext
1.
2.
3.
4.
void create_array(int* &array, int array_i, int array_j) {
       array = new int[array_i * array_j];
}
 



Удачи!
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539859
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,
насколько я понимаю, вы можете объявить указатель на первый элемент массива , и работать с ним. То есть может отправлять указатель в функцию, и далее работать со значениями массива по принципу *(PA+i). Если я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции.
В данном ответе я не уверен наверняка, но его прокомментируют, и вы будете знать прав ли я или нет
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539862
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, насколько я понял, объявление массива, например:
Код: plaintext
1.
int a[10]


значит, что вы объявили int* a(K&R пишут что имя массива является указательным выражением-страница 100), и это указательное выражение, хранит в себе адрес начала массива, и далее мы говорим, что одно значение будет занимать 4 байта(в зависимости от архитектуры), и гарантировано таких значений будет 10(впрочем с этим я не уверен, может он их все будет индексировать и считывать значения с 4 байт).
Потому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них, без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы. И вообще, может быть не стоит в качестве принимаемых параметров использовать массивы, если есть указатели. Или точнее сказать: так как есть указатели, мощнейший и чудеснейший инструмент C.

Все эти рассуждения касаются C, но мне почему-то кажется что C++ недалеко ушёл.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539867
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryкак мне кажется, массив это такое вымышленное понятие, несколько
искусственное, вообще ошибка, если кто-то говорит о них
А что ты имеешь в виду, набирая слово "массив"? Давай согласуем термины, а то может
оказаться, что мы говорим о разных вещах. Вот для меня "массив" это несколько однотипных
переменных, расположенных в памяти одна за другой. А для тебя?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539872
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для меня массив, это прежде всего указатель, который хранит адрес нулевого элемента, считывание данных будет происходить в объёме типа указателя, также определена операция *(A+i),i=0,1,..,n n belongs Z которая позволяет считывать значения в памяти через размерность типа указателя. В языке С.

Возможно, я неправильно сформулировал что-то, но общий принцип по которому я считаю правильно давать определение массива понятен.

Определения по типу " .. это несколько однотипных переменных, расположенных в памяти одна за другой " мне кажутся вымышленными, с одной стороны правильными, но некорректными. В языке С.

Все рассуждения получены в качестве логических размышлений из K&R.

PS

Несколько однотипных переменных это
Код: plaintext
1.
int a,b,c,d,e;


судя по логике, запись
Код: plaintext
1.
int a[10];



должна либо на уровне препроцессора, что навряд ли конечно, либо на уровне транслятора/компилятора преобразовываться к виду
Код: plaintext
1.
int a0,a1,a2,a3,..,a9;



Вот в таком случае это будет несколько однотипных переменных, но в данном случае далеко не факт что они будут расположены в памяти одна за другой. Потому мне кажется, что ваше утверждение, может быть некорректным и не до конца правильным.
Или всё же я ошибаюсь ?
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539874
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и очевидно что такие преобразования
Код: plaintext
1.
int a0,a1,a2,a3,..,a9;



в С не происходят.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539879
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,
Солтер Н.А. и Клепер С.Дж. (С++ для профессионалов) написали, как корректно выделить память для двумерного массива:
Код: plaintext
1.
2.
3.
4.
5.
6.
int x,y;

int** myArray = new int*[x]; //Выделяем для первой размерности массива

for (int i=0; i<x; i++)
    myArray[i]=new int[x];     //Выделяем для i-го подмассива.


Это код, мне кажется самый корректный!
На основании это, я написал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
int main()
{
    int array_i; //Количество строк
	int array_j; //Количество columns
	
	cout << "Enter array count:";  
        cout << "i:"; cin >> array_i; //Ввод Количество строк
        cout << "j:" ; cin >> array_j; //Ввод Количество столбцов
        cout << endl;
        
	//Инициализация массива
	int *myArray[array_i]; //Выделяем для первой размерности массива
		
	for (int i=0; i<array_i; i++)
	   myArray[i]=new int[array_j]; //Выделяем для i-го подмассива.
	   
        // Присваивание значение     
	for (int i=0; i<array_i; i++) 
	  for (int j=0; j<array_j; j++) 
		{
			myArray[i][j] = j;       // Присваивание значения для каждого ячейки массива  
		}	
    
       //Печать массива
       cout << "Array:" << endl;
       for (int i=0; i<array_i; i++)
	{
	  for (int j=0; j<array_j; j++)
	      cout << myArray[i,j] << "  ";
	  cout << endl;
	}
   return 0;
   //Конец main
}


У меня вот такой результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Enter array count:
i:5
j:5
Array:
0x3e2520  0x3e2540  0x3e2560  0x3e2580  0x3e25a0
0x3e2520  0x3e2540  0x3e2560  0x3e2580  0x3e25a0
0x3e2520  0x3e2540  0x3e2560  0x3e2580  0x3e25a0
0x3e2520  0x3e2540  0x3e2560  0x3e2580  0x3e25a0
0x3e2520  0x3e2540  0x3e2560  0x3e2580  0x3e25a0

--------------------------------
Process exited with return value 0
Press any key to continue . . .



Почему идет печать именно адрес памяти ячейки? Не понятно вообще!
Здесь С++ FAQ написали, что полностью отказаться надо от использования массивов-указатели в стиле С. Но новичок в мире С++ как я, не понимая массивов, как освоит других технологий С++?.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539880
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,
Мне не очень нравится ваш цикл, где происходит присваивание.
И в конце, на мой взгляд, правильно написать :

Код: plaintext
1.
2.
3.
4.
5.
6.
       for (int i=0; i<array_i; i++)
	{
	  for (int j=0; j<array_j; j++)
	      cout << [color=green]*[/color]myArray[i,j] << "  ";
	  cout << endl;
	}
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539881
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
for (int i=0; i<array_i; i++)
{
for (int j=0; j<array_j; j++)
cout << *myArray[i,j] << " ";
cout << endl;
}
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539882
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Происходит печать адреса, потому что элемент myArray[i,j] является указателем. Для того чтобы получить значение по адресу необходимо использовать операцию *myArray[i,j].

K&R(p 95)
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539884
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,
Да Вы правы!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
//Печать массиву
    for (int i=0; i<array_i; i++)
	{
	  for (int j=0; j<array_j; j++)
	      cout << *myArray[i,j] << "  ";
	  cout << endl;
	}


Теперь результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Enter array count:
i:5
j:5
Array:
0  0  0  0  0
0  0  0  0  0
0  0  0  0  0
0  0  0  0  0
0  0  0  0  0

--------------------------------
Process exited with return value 0
Press any key to continue . . .


Как можно осуществлять присваиванию!
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539885
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скачал K&R (3-е издание 2003). Вот читаю главу 5 (Указатели и массивы). Постараюсь понят!
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539928
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov, SashaMercury, ну что за фантазии на вольную тему.
Вам же выше Анатолий Широков написал, что myArray[i,j] это бессмысленная операция.
Она эквивалентна myArray[j], а так как у вас в myArray хранятся указатели на подмассивы, то соответственно
Код: plaintext
1.
cout << myArray[i,j] 

печатает адрес j-го подмассива.
И по той же причине, добавление разыменования * не поможет
Код: plaintext
1.
cout << *myArray[i,j] 


Оно будет печатать только нулевые элементы j-го подмассива.

Правильный код адресации такого массива такой
Код: plaintext
1.
cout << myArray[i][j] 



Таким образом резюмируя - если у вас в коде встречается конструкция array[a, b], то это замаскированный баг стопроцентной жирности.
Если не понятно почему - перечитывать учебники по основам С/С++ пока не придет понимание .
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539931
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:(
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38539941
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
мне стыдно конечно, что я сразу не заметил, но

Alimkulov Почему идет печать именно адрес памяти ячейки? Не понятно вообще!


Вопрос был почему адреса, я на этот вопрос и ответил, а на то как он обращается к элементам массива(неверно индексирует) внимания не обратил :C
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540160
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Если я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции.


ты ошибаешься.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540181
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, насколько я понял, объявление массива, например:
Код: plaintext
1.
int a[10]


значит, что вы объявили int* a


че за бред? int* 4 байта, int [10] - 40.
есть разница?


(K&R пишут что имя массива является указательным выражением-страница 100), и это указательное выражение, хранит в себе адрес начала массива, и далее мы говорим, что одно значение будет занимать 4 байта(в зависимости от архитектуры), и гарантировано таких значений будет 10(впрочем с этим я не уверен, может он их все будет индексировать и считывать значения с 4 байт).

ИМЯ массива, а не объявление массива.


Потому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них,

это только кажется. а когда кажется, надо креститься, тогда нечисть сгинет...

без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы. И вообще, может быть не стоит в качестве принимаемых параметров использовать массивы, если есть указатели.

вот это единственное нормальное замечание в посте. только есть одно но: в параметрах функции массив и указатель это одно и то же.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540198
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

SashaMercury,
Солтер Н.А. и Клепер С.Дж. (С++ для профессионалов) написали, как корректно выделить память для двумерного массива:
int x,y;

int** myArray = new int*[x]; //Выделяем для первой размерности массива

for (int i=0; i<x; i++)
myArray[i]=new int[x]; //Выделяем для i-го подмассива.

Это код, мне кажется самый корректный!


это не многомерный массив, это массив указателей на массивы.
это разные вещи. в памяти элементы располагаются совсем по другому.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540227
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
столько бреда понаписали в топике...
вечером буду наводить порядок...

1 отличайте массивы указателей от многомерных массивов.
2 отличайте указатели от массивов, массив выделяет память под все элементы, N*sizeof(elementtype), указатель - только sizeof(void*).

в с++ имеет смысл использовать ссылки на массивы, они могут сохранять размерность, или вектор верторов.
в последнем случае вообще все автоматом делается.

если же ты используешь функцию, надо использовать указатель на первый элемент массива и смещения в массиве вычислять самому.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540645
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

Код: plaintext
1.
2.
3.
4.
5.
int** a = new int*[2]; // это массив массивов
for(int i = 0; i < 2; ++i)
    a[i] = new int[2];

int b[2][2]; // это двухмерный массив 



так вот a и b совсем по разному лежат в памяти, хотя для тебя это оба двухмерных массива. b линейно располагает свои элементы

Код: plaintext
b[0][0] | b[0][1] | b[1][0] | b[1][1]  

тогда как a

Код: plaintext
1.
2.
a[0] -> a[0][0] | a[0][1]
a[1] -> a[1][0] | a[1][1]

по сути a - это набор из разрозненных участком динамической памяти - один под a, и два под a[0], a[1]

SashaMercury

никогда не смешивайте массив и указатель. массив приводится к указателю на свой первый элемент, но сущности это совершенном разные.

например,

Код: plaintext
1.
2.
int a[10];
int* b = a;



нука сдвиньте мне a на второй элемент? нет, не выйдет, поскольку a это не указатель. тогда как с b все достаточно тривиально

Код: plaintext
1.
b += 1;
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540664
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё интересно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int** a = new int*[2]; // это массив массивов
for(int i = 0; i < 2; ++i)
{
  if( !i )
    a[i] = new int[2];
  else
    a[i] = new int[200];
}

// и матрица стала непонятно каким ежём ...
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540672
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и я бы не называл это "массив массивов", на мой взгляд, массив массивов -- это многомерный массив.

Я бы называл это лучше "массив указателей", можно уточнить (но это не всегда так) "на динамически выделенные массивы".
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540910
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитал книги и сделал такой вывод:
В языке С/С++ предусмотрены многомерные массивы. Простейшим из них является двухмерный. По существу, двухмерный массив – это массив одномерных массивов.
В языке С/С++ указатели и массивы тесно связаны друг с другом. Имя массива без индекса – это указатель на его первый элемент.
Код: plaintext
1.
2.
3.
4.
5.
6.
int a[10];
//Следующие два выражения абсолютно идентичны.
a
&a[0]
//Это выражение является истинным (true)
а==&a[0]


Значит, адрес первого элемента массива совпадает с адресом всего массива.
Этого можно применять и к многомерным массивам.
Следующие два оператора будут эквивалентными:
Код: plaintext
1.
2.
a
&a[0][0]


Двухмерный массив можно представить с помощью указателя на массив одномерных массивов.
Опираясь на эти и на Ваши мнения, написал вот такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
int main()
{
    int array_i; //Количество строк
    int array_j; //Количество columns
	
    cout << "Enter array count:" << endl; 
	 
    cout << "i:"; cin >> array_i; //Ввод Количество строк
    cout << "j:" ; cin >> array_j; //Ввод Количество столбцов
    cout << endl;
        
	//Инициализация массива
	int *myArray[array_i]; //Выделяем для первой размерности массива
		
	for (int i=0; i<array_i; i++)
	   myArray[i]=new int[array_j]; //Выделяем для i-го подмассива.
	   
        // Присваивание значение     
	for (int i=0; i<array_i; i++) 
	  for (int j=0; j<array_j; j++) 
		myArray[i][j] = (i+1)*(j+1);       // Присваивание значения для каждого ячейки массива  
		
    //Вывод на экран
   cout << "Array:" << endl;
    for (int i=0; i<array_i; i++)
	{
	  for (int j=0; j<array_j; j++)
	      cout << *(int*) &myArray[i][j] << "    "; //Это операция выполняется быстрее, чем индексация.
	  cout << endl;
	}
   return 0;
   //Конец main
}



Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Enter array count:
i:5
j:5

Array:
1    2    3    4    5
2    4    6    8    10
3    6    9    12   15
4    8    12   16   20
5    10   15   20   25

--------------------------------
Process exited with return value 0
Press any key to continue . . .
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540920
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Далее буду разбираться передачи массивов на функции!
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540943
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,
В целом выглядит ок, но есть замечания.
1)
Код: plaintext
1.
int *myArray[array_i]; //Выделяем для первой размерности массива


А почему не
Код: plaintext
1.
int *myArray = new int*[array_i]


?
Вообще выделение локальных массивов заранее неизвестным размером, это нестандартная фича вашего компилятора. В С++ такого нет. Не гоовря уже о том что выделять массивы в стеке опасно, т.к. размер стека ограничен.

2)
Код: plaintext
1.
cout << *(int*) &myArray[i][j] << "    "; //Это операция выполняется быстрее, чем индексация.


Комментарий - бред.
Не только не быстрее, но еще и код становится нечитаемым - не делайте так никогда

3) Каждому выделению памяти чере new должно соответствовать удаление через оператор delete.
В этой простой программе которая сразу завершается это может и не имеет смысла, а вот в реальных программах будет утечка памяти.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38540980
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
Спасибо! Да Вы совершенно правы!
Anatoly Moskovsky2)
cout << *(int*) &myArray[i][j] << " "; //Это операция выполняется быстрее, чем индексация.

Комментарий - бред.
Не только не быстрее, но еще и код становится нечитаемым - не делайте так никогда

А как можно осуществлять доступ к элементам массива указателя?
Anatoly Moskovsky3) Каждому выделению памяти чере new должно соответствовать удаление через оператор delete.

Я с Вами согласен!
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541031
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlimkulovА как можно осуществлять доступ к элементам массива указателя?

Ну вот вы написали
Код: plaintext
1.
cout << *(int*) &myArray[i][j] 


а надо было
Код: plaintext
1.
cout << myArray[i][j] 



А разыменование, *, применяется если у вас уже есть указатель и вы хотите по нему прочесть или записать.
А специально получать адрес через & чтобы потом его тут же разыменовать - не надо.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541047
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlimkulovВ языке С/С++ указатели и массивы тесно связаны друг с другом. Имя массива без индекса – это указатель на его первый элемент.


Массивы и указатели никак не связаны друг с другом, кроме двух вещей:

и то, и другое подразумевает использование адресной арифметики.

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

Более указатели и массивы никак не связаны вроде бы.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541068
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Код: plaintext
1.
int *myArray[array_i]; //Выделяем для первой размерности массива


А почему не
Код: plaintext
1.
int *myArray = new int*[array_i]


?
Вообще выделение локальных массивов заранее неизвестным размером, это нестандартная фича вашего компилятора. В С++ такого нет. Не гоовря уже о том что выделять массивы в стеке опасно, т.к. размер стека ограничен.



Такое есть в С99, который, очевидно, поддерживается его компилятором (MINGW).
Но если включить strict ansi режим (ключ -ansi, если я правильно помню), то ...
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541073
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
3) Каждому выделению памяти чере new должно соответствовать удаление через оператор delete.
В этой простой программе которая сразу завершается это может и не имеет смысла, а вот в реальных программах будет утечка памяти.

Анатолий, здеть ТОЖЕ ЕСТЬ утечка памяти, только тут на неё можно наплевать. Потому что код неценен.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541179
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТакое есть в С99
В режиме С да.
А в С++ нет.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541281
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

И все же, в реальных задачах, особенно связанных с вычислениями и частыми обращениями к матрице, лучше когда матрица лежит в памяти в непрерывном пространстве, а не рабросана кусками по хипу. Поэтому линейная развертка рулит по сравнению с массивом массивов. Ты наверняка слышал такое понятие как "фрагментация" применительно к дискам. Так вот оно в равной степени относится и куче. Чем больше у тебя фрагментов, тем больше происходит перезагрузок кэша процессора, что сказывается на производительности.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541340
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков,
Я буду имеет ввиду Вашего мнений. Но пока моя цель - постепенно освоит все тонкости языка С++.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541346
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlimkulovАнатолий Широков,
Я буду имеет ввиду Вашего мнений. Но пока моя цель - постепенно освоит все тонкости языка С++.
Я буду учитывать Вашего мнения. Но пока моя цель - постепенно освоит все тонкости языка С++
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541378
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковAlimkulov,

И все же, в реальных задачах, особенно связанных с вычислениями и частыми обращениями к матрице, лучше когда матрица лежит в памяти в непрерывном пространстве, а не рабросана кусками по хипу. Поэтому линейная развертка рулит по сравнению с массивом массивов. Ты наверняка слышал такое понятие как "фрагментация" применительно к дискам. Так вот оно в равной степени относится и куче. Чем больше у тебя фрагментов, тем больше происходит перезагрузок кэша процессора, что сказывается на производительности.

Толя, еще и NUMA радости в этом отношении добавляет.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541381
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlimkulovAlimkulovАнатолий Широков,
Я буду имеет ввиду Вашего мнений. Но пока моя цель - постепенно освоит все тонкости языка С++.
Я буду учитывать Вашего мнения. Но пока моя цель - постепенно освоит все тонкости языка С++

так в смысле тонкости самому адресацию в многомерном массиве сложнее написать.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541396
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlimkulovА как можно осуществлять доступ к элементам массива указателя?
Ты так пишешь "указатель", будто считаешь его чем-то большим, чем порядковым номером
ячейки памяти, почти мистической сущностью...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541401
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSashaMercury,

Если я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции.


ты ошибаешься.


Старница 98. Строчки 1-2.
K&RУказатели в качестве аргументов обычно используются в функциях, которые должны возвращать более одного значения.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541407
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВообще, насколько я понял, объявление массива, например:

int a[10]

значит, что вы объявили int* a

че за бред? int* 4 байта, int [10] - 40.
есть разница?



не вырывайте из контекста, пожалуйста. я написал:
SВообще, насколько я понял, объявление массива, например:
int a[10]

значит, что вы объявили int* a(K&R пишут что имя массива является указательным выражением-страница 100), и это указательное выражение, хранит в себе адрес начала массива, и далее мы говорим, что одно значение будет занимать 4 байта(в зависимости от архитектуры), и гарантировано таких значений будет 10(впрочем с этим я не уверен, может он их все будет индексировать и считывать значения с 4 байт).


Про гарантированных 40 байт я написал.

MasterZivSПотому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них,
это только кажется. а когда кажется, надо креститься, тогда нечисть сгинет...

А разве не вымышленное ? Абстракция, накрученная. В K&R до 102 страницы я не встретил чёткого определения массива, и возможно это неопределяемое понятие в C, как и понятие множества в математике. Не буду приводить ссылки на функан, википедии вам хватит link_for_MasterZiv

и, ВЫ снова вырываете из контекста.Вы разорвали мою фразу я написал,

SПотому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них, без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы



MasterZivS
без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы. И вообще, может быть не стоит в качестве принимаемых параметров использовать массивы, если есть указатели.


вот это единственное нормальное замечание в посте. только есть одно но: в параметрах функции массив и указатель это одно и то же.



Одно из трёх утверждений вам понравилось ?Уже неплохо.
не одно и то же. Указатель понятие фундаментальное в фон-неймановской архитектуре, а массив абстракция
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541418
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryMasterZivSashaMercury,

Если я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции.


ты ошибаешься.


Старница 98. Строчки 1-2.
K&RУказатели в качестве аргументов обычно используются в функциях, которые должны возвращать более одного значения.

У вас какой K&R. Тут у меня на странице №98 речь идет о функции а не массивах. Может я читаю не тот изданию?
Можете написать конкретно, у вас какое издание и ссылки. У меня 3-е издание (2003г.)
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541424
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

k&_txt

5.2. Указатели и аргументы функций
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541442
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryMasterZivSashaMercury,

Если я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции.


ты ошибаешься.


Старница 98. Строчки 1-2.
K&RУказатели в качестве аргументов обычно используются в функциях, которые должны возвращать более одного значения.


Видимо должен быть какой-то контекст, который бы придал этим словам суть.
Я полагаю, что речь идет как раз о модификации в функции внешнего массива, как бы "возврата из функции массива". "Как бы" -потому что естественно вернуть массив из функции невозможно в С.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541444
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Код: plaintext
1.
Указатели в качестве аргументов обычно используются в функциях, которые должны возвращать более одного значения.


Тут идет речь про такое:
Код: plaintext
1.
2.
3.
int a, b;
a = get_a(); // возвращается одно значение
get_a_b(&a, &b); // возвращается несколько значений через аргументы-указатели
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541446
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЕсли я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции.

Старница 98. Строчки 1-2.
K&RУказатели в качестве аргументов обычно используются в функциях, которые должны возвращать более одного значения.


Да, если хочется вернуть более одного значения из функции, можно воспользоваться указателями. Например деление с остатком:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void div( int a, int b, int *quotient, int *reminder) {
   *quotient = a / b;
   *reminder = a - (b* (*quotient) );
}

int main (...) {
   int x, y;
   int q, r;

   x = 10; y = 3;
   div(x, y, &q, &r);
   printf("%d = %d*%d+%d\n", x, y, q, r);
   return 0;
}
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541469
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребята, это не возврат из функции чего-то. Это - модификация параметров, переданных по ссылке. давайте не будем путать понятия, даже если у Кернигана так написано.

В С вообще нельзя вернуть из функции несколько значений. одно или 0.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541492
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv давайте не будем путать понятия, даже если у Кернигана так написано.

Простите, но если именовать книгу одной фамилией, то скорее :"если у Ритчи так написано", авторство языка принадлежит ему(и Кену Томпсону ). Может быть Вы хотели сказать что в определение слова "возврат из функции" авторы вложили более широкий смысл ?

И что мы понимаем под возвратом значений из функции ? Я не знаю чёткого определения. f e:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int array[10]=smth_func();//вот эта функция по вашему возвращает значение
int* Parray=array;//либо ...=&array[0];
void smth_func_2(int* a)
{
for(int i=0;i<10;i++)
     *(a+i)=i;
}

smth_func_2(Parray);//а вот эта функция по вашему не возвращает значение



Вы бы сделали аналогичные комментарии к этим двум функциям ?
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541552
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
void smth_func_2(int* a)
{
for(int i=0;i<10;i++)
     *(a+i)=i;
}
smth_func_2(Parray);//а вот эта функция по вашему не возвращает значение

естественно функция smth_func_2 не возвращает значение, ведь тип возвращаемого значения у неё void .
Другое дело, что она модифицирует свой входной параметр. Это называется побочным эффектом , а не возвращением значения.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541566
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы назвал это косвенный возврат значений, или ссылочный возврат значений. Нужно подумать, как лучше. В широком смысле этого слова функция возвращает значения, но неявно. Где первоисточник этого словосочетания "побочный эффект" ?
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541597
Господа, опомнитесь, начали за C++, а кончаете за Ричи. Охота вернуть несколько значений - см. std::tuple tie make_tuple, правда в коде это все равно выродится скорее всего в заполнение функцией буфера по переданному ей адресу.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541655
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury. Где первоисточник этого словосочетания "побочный эффект" ?
там где определяется "чистая функция"
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541736
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ бы назвал это косвенный возврат значений, или ссылочный возврат значений. Нужно подумать, как лучше. В широком смысле этого слова функция возвращает значения, но неявно. Где первоисточник этого словосочетания "побочный эффект" ?

Функция --она на то и функция, чтобы возвращать. Вотэто она и возвращает. Явно.
А всё остальное -- это побочные эффекты.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541740
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryMasterZiv давайте не будем путать понятия, даже если у Кернигана так написано.

Простите, но если именовать книгу одной фамилией, то скорее :"если у Ритчи так написано", авторство языка принадлежит ему(и Кену Томпсону ). Может быть Вы хотели сказать что в определение слова "возврат из функции" авторы вложили более широкий смысл ?

И что мы понимаем под возвратом значений из функции ? Я не знаю чёткого определения. f e:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int array[10]=smth_func();//вот эта функция по вашему возвращает значение
int* Parray=array;//либо ...=&array[0];
void smth_func_2(int* a)
{
for(int i=0;i<10;i++)
     *(a+i)=i;
}

smth_func_2(Parray);//а вот эта функция по вашему не возвращает значение



Вы бы сделали аналогичные комментарии к этим двум функциям ?


Да. Первая -- возвращает, вторая -- нет.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541781
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryГде первоисточник этого словосочетания "побочный эффект" ?Я ссылку дал, чукча не-читатель?
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541791
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
не вырывайте из контекста, пожалуйста. я написал:
SВообще, насколько я понял, объявление массива, например:
int a[10]

значит, что вы объявили int* a(K&R пишут что имя массива является указательным выражением-страница 100), и это указательное выражение, хранит в себе адрес начала массива, и далее мы говорим, что одно значение будет занимать 4 байта(в зависимости от архитектуры), и гарантировано таких значений будет 10(впрочем с этим я не уверен, может он их все будет индексировать и считывать значения с 4 байт).


Про гарантированных 40 байт я написал.



Вот ведь блин... Вырываю я...

Ничего я не вырываю, вот весь этот абзац и является полным бредом.
"имя массива является указательным выражением" --- имя массива в виде выражения, а не выражение объявления переменной типа массива.
Разницу чувствуешь ? Это два разных совсем выражения.

Код: plaintext
1.
int a[10];



объявляет массив из 10 элементов типа int, с именем 'a'.
Это значит:
выделяется 10*sizeof(int) последовательно идущих байт в области памяти, соответствующей данному классу памяти.

в соответствующий словарь имён заносится имя 'a'

в памать размещается значение согласно инициализатору (тут инициализатора нет, поэтому зависит от класса памяти)

Код: plaintext
1.
int *b = a;



объявляет указатель на int, с именем 'b'.
Это значит:

выделяется sizeof(int*) - 4 или 8 байт.

в соответствующий словарь имён заносится имя 'b'

в указатель заносится адрес первого элемента массива 'a'

И вот только тут (!!) срабатывает то самое, о чём ты пытался нам донести -- компилятор видит выражение, содержащее символ названия массива и преобразует это выражение в указатель на первый элемент этого массива.
Еще раз, боле у указателей и массивов нет ничего общего.
(А, не, ещё есть дурацкая нотация параметров функций-указателей в виде массива без указанной размерности, с которой начался топик, об этом -- отдельно).

SashaMercuryMasterZivпропущено...

это только кажется. а когда кажется, надо креститься, тогда нечисть сгинет...

А разве не вымышленное ? Абстракция, накрученная. В K&R до 102 страницы я не встретил чёткого определения массива, и возможно это неопределяемое понятие в C, как и понятие множества в математике. Не буду приводить ссылки на функан, википедии вам хватит link_for_MasterZiv

и, ВЫ снова вырываете из контекста.Вы разорвали мою фразу я написал,

SПотому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них, без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы




Хочется ответить словами "поэта":
"Ты суслика не видишь ? А суслик есть!"
Так и тут. А определение массива я думаю ты легко найдёшь в стандарте языка (С, С++).

SashaMercuryОдно из трёх утверждений вам понравилось ?Уже неплохо.
не одно и то же. Указатель понятие фундаментальное в фон-неймановской архитектуре, а массив абстракция

Указатель и массив -- в данном случае понятия языка программирования . В архитектуре есть адреса памяти и слова и байты памяти.
И далеко не во всех языках программирования есть указатели и ссылки. Да и массивы тоже
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541875
Фотография Macks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВообще, насколько я понял, объявление массива, например:
Код: plaintext
1.
int a[10]


значит, что вы объявили int* a


че за бред? int* 4 байта, int [10] - 40.
есть разница?


Код: plaintext
1.
int a[10]



значит, что вы объявили int* a
Код: plaintext
1.
int* a = new int[10]:



Только память будет выделена возможно по разному
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541883
Фотография Macks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivИ далеко не во всех языках программирования есть указатели и ссылки. Да и массивы тоже


Язык Элочки Людоедки.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38542036
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Macks
Код: plaintext
1.
int a[10];


значит, что вы объявили int* a
Код: plaintext
1.
int* a = new int[10]:

нет, не значит. Это разные конструкции. В том числе и потому, что память ОБЯЗАТЕЛЬНО будет выделена по разному.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38542049
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MacksMasterZivВообще, насколько я понял, объявление массива, например:
Код: plaintext
1.
int a[10]


значит, что вы объявили int* a


че за бред? int* 4 байта, int [10] - 40.
есть разница?


Код: plaintext
1.
int a[10]



значит, что вы объявили int* a
Код: plaintext
1.
int* a = new int[10]:



Только память будет выделена возможно по разному

О, ещё один ...

Ладно, переубеждать не буду, живите, до первого собеседования...
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38542129
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivдо первого собеседования...
там мож про деструкторы расскажут....
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38542987
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,
вам нужно быть несколько более уравновешенным. если у вас какие-то проблемы в личной жизни, или на работе, не стоит своё чёрное настроение переводить сюда.

+Изопропил

первоисточник я встретил сегодня в K&R, старница 56, глава 2.12 Старшинство и порядок вычислений.

Администраторы форума, я прошу вас обратить внимание на хамство egorych, его не стоит банить конечно, но обратить внимание, мне кажется, стоит

Модератор: Обратили, обратили, не беспокойся. Лучше бы ты сам на него меньше внимания обращал.

egorychЯ ссылку дал, чукча не-читатель?

ваша ссылка не первоисточник.

И описания в K&R и на том сайте различны, я больше доверяю K&R.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38542992
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychестественно функция smth_func_2 не возвращает значение, ведь тип возвращаемого значения у неё void .
Другое дело, что она модифицирует свой входной параметр. Это называется побочным эффектом , а не возвращением значения.
MasterZivФункция --она на то и функция, чтобы возвращать. Вотэто она и возвращает. Явно.
А всё остальное -- это побочные эффекты.
Вот вы докопались.
Вы не видите что-ли разницу между алгоритмом и реализацией на языке программирования?

Если я напишу программу которая выводит на экран картинку, то в языке С/С++ она тоже не выводит картинку, а вызывает функции, присваивает, читает переменные и т.д. Нету вывода картинок в С.
Но если подняться на более высокий уровень, то все это вместе реализует алгоритм "вывод картинки".

В исходной цитате К/Р речь идет о возврате нескольких значений алгоритмом, а не о возврате значений как синтаксической конструкции С. И о том, что на С, такой возврат обычно реализован через модификацию значений через аргументы-указатели.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38543019
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

я думаю что в данном случае вы правы. Но первоначально мне так не казалось.

а по поводу побочного эффекта, не вижу смысла продолжать дискуссию. Мне понравилось слово "явно", значит моя мысль хотя бы немного, но имеет право на жизнь.
И действительно, возможно у нас несколько разная грань между алгоритмом и программным кодом, в связи с этим разное понимание общих вопросов.

Я стал понимать больше и шире, спасибо.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38543087
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВот вы докопались.я то думал, он разобраться хочет, а он, видишь ли, ябеда оказался ))
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38543277
Фотография Сергей Силкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlИ обязательно прочти Таненбаума!Абсолютно согласен. Уже официально признано классикой ИТ.

Кстати, его книги свободно гуляют по Сети, так что их абсолютно без проблем можно найти и скачать совершенно бесплатно на множестве серверов. (Не сочтите за труд – поищите сами.)

Если будут предлагать заплатить деньги или ввести номер телефона для скачивания – не соглашайтесь, ищите бесплатный ресурс с книгами, каковых есть множество.

Если для проверки, что вы не робот, потребуется ввести ответ на какой-нибудь простой вопрос – это можно сделать, это совершенно бесплатно и совсем не трудно.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38543298
Фотография Сергей Силкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виноват, предыдущее сообщение не в той ветке опубликовал. Но, поскольку сообщение общего характера, а автор обеих веток один и тот же человек – думаю, он поймёт, к чему это. Другие товарищи, думаю, тоже сообразят – грамотные же люди…
...
Рейтинг: 0 / 0
73 сообщений из 73, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача массивов в функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]