Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C (СИ) Подправьте код где надо. Динамическое распределение памяти в языке С, Символьные данные и строки https://www.cyberforum.ru/ c-beginners/ thread797699.html
Подправьте код под Visual Studio 2010 на Си Задание 1. В программе определите и инициализируйте переменную X типа double, указатель double * и указатель типа void *. Присвойте указателям адрес...
C (СИ) Последняя группа совершенных чисел
Создать двоичный файл и записать в него n целых чисел. Последнюю группу совершенных чисел из исходного файла переписать в текстовый файл. Помогите пожалуйста, первую часть задания могу сделать, а...
Проверка вводимой информации C (СИ)
Добрый день. При вводе в программе номера группы студента(Тип данных - структура) необходимо проверить правильность ввода. *** ... printf(Rus("\nНомер группы:\n\n")); ...
C (СИ) Строки Дана строка. Найти число вхождений в ее подстроку , расположенную левее первого символа «.», подстроки из двух символов «:=». Если символ «.» является самым первым символом исходной строки, либо... https://www.cyberforum.ru/ c-beginners/ thread797613.html
C (СИ) Сформировать матрицу по заданному образцу https://www.cyberforum.ru/ c-beginners/ thread797608.html
Сформировать матрицу по заданному образцу не могу фотку вставить((( но как то так):swoon: l 1 l 1 l 1 l ...l 1 l l 2 l 2 l 2 l ...l 2 l l...l ...l ...l ...l...l l n l n l n l ...l n l
Побитовая обработка: в каждом байте переместить все единичные биты в конец C (СИ)
В каждом байте переместить все единичные биты в конец (Без использования строк и массивов). Есть программа для подсчета единичных битов, но не знаю как их переместить. #include <stdio.h> #include...
C (СИ) Мистика с функциями
Всем привет форумчане! У меня на пути познания C возникла одна мистическая проблема, вот: по отдельности эти две функции работают отлично void symbols() { int i = 0, c; while((c = getchar()) !=...
C (СИ) Вычислить и вывести на экран таблицу всех 20 значений функции делаю лабороторную "цилкы" Вычислить и вывести на экран таблицу всех 20 значений функции z(i,j)=xi2+yi3; для xi=x1, x2, x3, x4; yi = y1, y2,…, y5 Исходные данные: x1 = 0.1, x2 = 0.2, x3 = 0.3, x4... https://www.cyberforum.ru/ c-beginners/ thread797553.html
C (СИ) Найти произведение, сумму и количество отрицательных элементов массива https://www.cyberforum.ru/ c-beginners/ thread797552.html
Привет)) Заполнить матрицу m*n с клавиатуры. Найти произведение,сумму и количество отрицательных элементов массива. Спасибо:*
C (СИ) Вывести на печать исходный массив и предпоследний столбец массива Заполнить случайными числами матрицу n*m. Вывести на печать исходный массив и предпоследний столбец массива. Спасибо! https://www.cyberforum.ru/ c-beginners/ thread797534.html
...
1793 / 1260 / 932
Регистрация: 12.02.2013
Сообщений: 2,058
04.03.2013, 07:50 0

Выделение памяти под динамический массив

04.03.2013, 07:50. Просмотров 1039. Ответов 3
Метки (Все метки)

Ответ

Извините за столь долгое молчание, дела.

Цитата Сообщение от BuBlicK.SQP Посмотреть сообщение
1. Зачем использовать двойной указатель? Я всюду использовал один указатель и только на матрицу.
2. Как работают (int**), (int*) и (int)? В чем разница?
3. Как правильно определить нужный объем памяти? Я, например выделил (n*n+1)
Начнём пожалуй вообще с понятия указатель. Вы, я полагаю, уже поняли, что это такая же переменная, только в себе хранит адрес участка памяти. Т.е. выглядит это примерно так:
Название: pointer01.png
Просмотров: 173

Размер: 15.5 Кб
Основной особенность такой переменной является применение к ней разадресации, т.е. когда вы пишите *b, происходит переход по адресу хранимого в переменной b. Для простых переменных разадресация не применима. И т.к. указатель хранит всего-лишь адрес, то он применим как к конкретной переменной, так и к вектору (массиву) значений. Т.е. вы можете получить значение так *b, и так b[0] (по сути компилятор преобразует эту запись в *(b+0)). Соответственно ваш массив представляется следующим образом:
Выделение памяти под динамический массив

Как видите, такой массив - это указатель на список указателей векторов. Поэтому и выделение памяти было хитрым:
  1. Выделяем память под массив указателей matrix = (int**) malloc(n * sizeof(int*));
  2. А теперь выделяем память под каждый вектор в цикле matrix[i] = (int*) malloc(n * sizeof(int));.
Я думаю все что изложено выше вам даст ответы на ваши вопросы.

P.S.: вообще-то это всё рассматривается практически в любой книге по C/C++.

Вернуться к обсуждению:
Выделение памяти под динамический массив
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2013, 07:50
Готовые ответы и решения:

Выделение памяти под динамический массив строк
Суть программы такова: при вызове функции количество структур увеличивается на одну, выделяется под...

Выделение памяти под динамический массив выдает ошибку
В общем проблема такова, при компиляции вылазит ошибка: 27 C:\Users\USER\Desktop\projects\main.c...

Выделение памяти под двумерный массив
Здравствуйте! скажите пожалуйста почему нельзя выделить под двумерный массив память через функцию....

Динамическое выделение памяти под массив
Здравствуйте, помогите пожалуйста сделать в процедуре input динамическое выделение памяти под...

3
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.