LINUX.ORG.RU

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


0

0

#include<iostream>
using namespace std;
int main()
{
	int *b;
	int c=5;
	b=new int[c];
}

Зачем нужна звёздочка? Если можно - скажите простым языком. 
Иначе без неё выдаётся ошибка:

13: error: invalid conversion from ‘int*’ to ‘int’

У меня в книжке написано, что * переводится как "по адресу" - но к чему это тут?

int var; - переменная типа int

int *var; - переменная, содержащая адрес на переменную типа int

Deleted
()

"int *" - указатель на int

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

naryl ★★★★★
()

Мдя. Тут как-то даже сказать нечего: посоветовать книжку почитать - так он её уже читает; посоветовать выкинуть книжку и прочесть другую - так может он так K&R читает... О! Придумал! Мужик, убей себя об стену, ладно?

Miguel ★★★★★
()
Ответ на: комментарий от Deleted

>int *var; - переменная, содержащая адрес на переменную типа int

адрес переменной указывается не *, а &, по крайней мере у меня написано, что & переводится как "адрес переменной", а * переменная "по адресу".

Wedge_Antilles
() автор топика
Ответ на: комментарий от Wedge_Antilles

>адрес переменной указывается не *, а &

Зависит от контекста. Например
int b = 4;
int *a = &b;
/* тут мы взяли адрес переменной оператором & и поместили его в указатель а */

int b = 4;
int &a = b;
/* тут мы сделали a ссылкой на b */

Выяснить разницу между ссылкой и указателем - твоё домашнее задание

mint
()
Ответ на: комментарий от mint

Подсказка: Скотт Мейерс, "More Effective C++", правило 1

mint
()
Ответ на: комментарий от mint

>Выяснить разницу между ссылкой и указателем - твоё домашнее задание

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

имел опыт наблюдать.

xydo ★★
()
Ответ на: комментарий от xydo

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

Ну дак он сначала указатели осилит, а затем ссылки. Будем надеяться =).

Deleted
()
Ответ на: комментарий от Miguel

Ты с чего и чем рухнул? Откуда в K&R про new возьмётся?

anonymous
()
Ответ на: комментарий от Wedge_Antilles

>Осиль сначала хорошие манеры, а потом уже пиши свои никого не интересующие имхи сюда.

тебе то же самое можно сказать про работу с памятью и вопросы. то, что ты написал - основы, которые разбираются в любой обзорной книге по C++; вместо того чтобы потратить где-то с час своего драгоценного времени, ты задаёшь вопрос здесь

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Тебя никто не просит мне отвечать или вообще заходить в этот тред. Тем, кто мне ответил - я благодарен, меня избавили от необходимости выкачивать 300 Mb книги. А ты если подумаешь, что говоришь, то поймёшь, что не прав и должен извиниться.

Wedge_Antilles
() автор топика
Ответ на: комментарий от Wedge_Antilles

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

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

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

Wedge_Antilles
() автор топика
Ответ на: комментарий от Wedge_Antilles

>Не знаю какая книга - я сфотографировал пару страничек методички преподавателя

это уже не трагедия, это уже детектив. а просто взять и почитать запрещено?

>А за слова по поводу "ткну носом" Вам будет завтра стыдно

это ещё почему?

вообще же рассматривается какая-то фантасмагорическая ситуация: изучение языка программирования без какой-либо документации, получение необходимых сведений с помощью "фотографирования страниц в методичке"...я понимаю, что лёгких путей мы не ищем - но something is rotten in the state of Denmark

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Это конечно всё захватываще, но не по теме, а рассказывать мне просто незачем всё. Советую тьлько запомнить - что если на в ксероксе присутствует только чёрный и белый цвет, то в жизни это не всегда так... Кстати, интересно, но по вашему тону я определил что вы из Украины, ещё до того как посмотрел профиль. Ничего личного.

Wedge_Antilles
() автор топика
Ответ на: комментарий от Wedge_Antilles

Странно. Студентишко, а гонору как у купчишки.

anonymous
()
Ответ на: комментарий от Wedge_Antilles

>Это конечно всё захватываще, но не по теме, а рассказывать мне просто незачем всё. Советую тьлько запомнить - что если на в ксероксе присутствует только чёрный и белый цвет, то в жизни это не всегда так

из этого ещё не следует, что у тебя чёрное с оттенками, а у остальных всё радужно и позитивно; вот только никакие жизненные обстоятельства (тем более настолько сомнительные) не компенсируют отсутсвия желания подумать самому

>Кстати, интересно, но по вашему тону я определил что вы из Украины

это нормально, на ЛОРе телепатия развивается на раз :)

>Ничего личного

да аналогично, что уж там

jtootf ★★★★★
()

ладно. будем считать что мне стало тебя жалко

не вдаваясь в подробности: в C++ токен '*' может быть трактован тремя различными образами: как унарный оператор взятия адреса (разыменования), как бинарный оператор умножения, и как составная часть объявления типа переменной; в последнем случае к '*' применяются правила разбора, отличные от остальных квалификаторов типа (так int * i, j; объявляет переменную i типа int *, и переменную j типа int). массив в C++ семантически является обыкновенным указателем (с некоторыми оговорками), соответственно оператор new[] возвращает указатель на первый элемент массива. оператор [] является синтаксическим сахаром для операции разыменования (a[n] = *(a + n) = *(n + a) = n[a])

а в дальнейшем учти: задавать глупые вопросы - нормально, даже полезно; демонстрировать уязвлённую гордость и Богатый Внутренний Мир - первый шаг к ФГМ. умерь спесь, парень

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Хм... о чём вы? Просто переварить написанное новичку, который до этого не изучал другие языки не самое лёгкое занятие. Хотя, действительно писали зря, ибо подачки "из милости" мне не нужны.

Wedge_Antilles
() автор топика
Ответ на: комментарий от Wedge_Antilles

>Хотя, действительно писали зря, ибо подачки "из милости" мне не нужны

тьху. в таком случае насчёт ФГМ опасаться поздно, тут уже степень близкая к терминальной. тебе шашечки или ехать? ответы на вопросы или уважение к твоему невежеству?

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

У нас в России принято если делать что-то, то делать это с душой. Или не делать вообще. Но уж чего не принято - так это издеваться над собеседником. По крайней мере в культурной среде.

Wedge_Antilles
() автор топика
Ответ на: комментарий от Wedge_Antilles

В среде интеллигенции как раз очень даже принято было подтрунивать над явно неадекватными собеседниками. Всегда.

anonymous
()
Ответ на: комментарий от Zenom

>Дык это ж противоположные вещи!

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

jtootf ★★★★★
()
Ответ на: комментарий от Wedge_Antilles

>У нас в России принято если делать что-то, то делать это с душой. Или не делать вообще. Но уж чего не принято - так это издеваться над собеседником. По крайней мере в культурной среде.

а думать прежде чем говорить у вас не принято? между прочим этот твой комментарий - 5.3, тебе с ним не сюда, а в клуб надо. или правила ЛОРа прочитать ты тоже не удосужился? тогда почитай хотя бы это:

http://www.segfault.kiev.ua/smart-questions-ru.html

jtootf ★★★★★
()
Ответ на: комментарий от Wedge_Antilles

<quote on>
Вполне вероятно, что вы уже облажались несколько раз в хакерских форумах — так, как описано в этой статье, или аналогично. И вам уже объяснили, как именно вы облажались, возможно, в красках. При всем честном народе.

Когда такое происходит, самая неудачная реакция - жаловаться на случившееся, считать себя оскорбленным словесно, требовать извинений, вопить, задыхаться от гнева, подавать иски в суд, жаловаться работодателям обидчиков, не опускать за собой сидения унитаза и т.п. Вместо всего этого надо сделать следующее:

Смириться. Это - нормально. На самом деле, это хорошо и целесообразно.
</quote off>
(C) Smart questions

Wedge_Antilles, без обид, но мануал по приведенной выше ссылке почитай.

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

Что показалось обидным? То, что одному трудно разобраться с указателями/ссылками, не имея предыдущего опыта? Дык так оно и есть. RTFM по ссылке, короче :)

Slavaz ★★★★★
()

Итак, последнее пока не доделал, приду доделаю и покажу окончательный вариант.

#include<iostream>
using namespace std;
int main()
		
{	//исходная матрица, из которой мы будем выбирать
	//отрицательные элементы и последовательно помещать их
	//в одномерный массив
	int a[4][3]={
		{2,3,-1},
		{-5,1,3},
		{4,-7,2},
		{1,-2,9}
	};
	
	//следующим действием мы узнаём количество отрицательных
	//элементов для создания одномерного динамического массива
	int i,j,k=0;
	for (i=0; i<4; i++)
	{
		for (j=0; j<3; j++)
		{
			if (a[i][j]<0) k=k+1; 
		}
	}
	
	int *b=new int[k]; //создаём массив динамической длинны
	
	/* Теперь снова перебирая элементы матрицы последовательно заносим
	только отрицательные элементы в новый одномерный массив */
	for (i=0; i<4; i++)
	{
		for (j=0; j<3; j++)
		{
			if (a[i][j]<0) b;
		}
	}
	

}

Wedge_Antilles
() автор топика
Ответ на: комментарий от jtootf

Я так и подумал. Ну не может пингвин с лямбдой на пузе говорить такие вещи трезвым%)

Zenom ★★★
()

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

#include<iostream>
using namespace std;
int main()
		
{	//исходная матрица, из которой мы будем выбирать
	//отрицательные элементы и последовательно помещать их
	//в одномерный массив
	int a[4][3]={
		{-6,3,-1},
		{-5,1,-3},
		{-4,-7,2},
		{-8,-2,9}
	};
	
	//следующим действием мы узнаём количество отрицательных
	//элементов для создания одномерного динамического массива
	int i,j,k=0;
	for (i=0; i<4; i++)
	{
		for (j=0; j<3; j++)
		{
			if (a[i][j]<0) k++; 
		}
	}
	
	int *b=new int[k]; //создаём массив динамической длинны
	
	int m=0; //счётчик для перебора элементов одномерного массива
	
	/* Теперь снова перебирая элементы матрицы последовательно заносим
	только отрицательные элементы в новый одномерный массив */
	
	for (i=0; i<4; i++)
	{
		for (j=0; j<3; j++)
		{
			if (a[i][j]<0)
			{
				b[m]=a[i][j];
				m++;
			}
		}
	}
	
	//Выводим итоговый массив на экран
	
	for (i=0; i<k; i++)
	{
		cout<<b[i]<<endl;
	}
	

}

/*

-6
-1
-5
-3
-4
-7
-8
-2

*/

Wedge_Antilles
() автор топика
Ответ на: комментарий от Wedge_Antilles

Выложи этот код под Грегоре EULA.

ЗЫ: Это все можно в одну строчку сделать через std::remove_copy_if + std::back_inserter. И вывести на экран через std::for_each.

Absurd ★★★
()
Ответ на: комментарий от Absurd

>ЗЫ: Это все можно в одну строчку сделать через std::remove_copy_if + std::back_inserter. И вывести на экран через std::for_each

ты ещё учти, что данные задаются статически, а следовательно все расчёты можно выполнить посредством MPL в компайл-тайм ;)

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

>ты ещё учти, что данные задаются статически, а следовательно все расчёты можно выполнить посредством MPL в компайл-тайм ;)

В компайл-тайм в плюсах массивов нет. Хотя можно, конечно заюзать Loki::Typelist + Loki::Int2Type, гы.

Absurd ★★★
()
Ответ на: комментарий от Wedge_Antilles

>И эти комплахрены скомпилируются чтоли на борланд с 3.1?

а поставить MinGW, или православный GCC что мешает?

jtootf ★★★★★
()
Ответ на: комментарий от anonymous

>Тебе ещё не намекали, что ты быдло?

Я не знаю кто тут быдло, но вы дорогой товарищ, портите интеллигентную перепалку.

Молодому человеку вежливо объясняют ху ис ху, а Вы: "быдло..".

// me подавился попкорном.

ansi ★★★★
()
Ответ на: комментарий от jtootf

Вероятно, у лирического героя нашего дорогого тролля "в методичке про MinGW и GCC ничего не написано".

anonymous
()
Ответ на: комментарий от jtootf

У меня и так g++...

Пакет: build-essential
Состояние: установлен
Автоматически установлен: нет
Версия: 11.3
Приоритет: необязательный
Раздел: devel

А вот в институт поставить что-либо другое мне никто не даст.

Wedge_Antilles
() автор топика
Ответ на: комментарий от Absurd

>В компайл-тайм в плюсах массивов нет

typedef mpl::vector_c<int,0,0,0,0,0,0,0>?

>Хотя можно, конечно заюзать Loki::Typelist + Loki::Int2Type, гы.

можно и так. трюков тут в принципе много, но сделать можно; а посредством препроцессора ещё и к более-менее читаемому виду привести

jtootf ★★★★★
()
Ответ на: комментарий от Wedge_Antilles

Подумай, что тебе нужнее - научиться или сдать. Если последнее - то вообще не парься и спиши у ботанов. Если первое - то учись как надо, а не как тебя в твоём быдлятнике всякие идиоты учат.

anonymous
()
Ответ на: комментарий от Wedge_Antilles

>Не знаю, я купил "С++ для чайников"

и кто-то ещё говорит про уважение к своей персоне? выкинь, купи лучше Липпмана или Кёнига/Му

>там вроде никаких комплатанов или как их, не замечено...

подавился бубликом (с)

jtootf ★★★★★
()
Ответ на: комментарий от Wedge_Antilles

>А вот в институт поставить что-либо другое мне никто не даст

это вопрос желания, захочешь - поставишь; надо просто уметь аргументировать свои действия. и прекратить себя жалеть заодно

jtootf ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.