Форум программистов, компьютерный форум CyberForum.ru

Указатели - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Ошибки копиляции http://www.cyberforum.ru/cpp-beginners/thread325130.html
Решил изучать С++ по книге Стефана Р. Девиса "С++ для начинающих". Написал пример програмки из книги в DEV-C++. Всё написано правильно, однако при компиляции происходят ошибки, которые вы видете на фото. При нажатии на первую строчку в строке ошибок ничего не происходит, а если нажать на остальные, ошибки выделяются. Подскажите пожалуйста, как их исправить. Вроде бы всё представил...
C++ что не так с программой? С++. помогите, пожалуйста, завтра сдавать уже! при компиляции виснет. Задание такое: в матрице найти 1) максимум среди сумм диагоналей, параллельных побочной 2) произведение в тех строках, где нет отрицательных элементов вот мой код: #include<iostream.h> #include<math.h> void main() http://www.cyberforum.ru/cpp-beginners/thread325129.html
Ошибка в строке file.write C++
Помогите разобраться с записью file.write (49строчка) в чем ошибка??? #include <iostream> #include <fstream> #include <stdlib.h> #include <locale> #include <iterator> #include <conio.h> #include <string> #include <vector> #include <algorithm>
C++ Написать программу, которая по номеру месяца выдает название следующего за ним месяца (при т = 1 получаем февраль, 4 - май и т.д.).
Написать программу, которая по номеру месяца выдает название следующего за ним месяца (при т = 1 получаем февраль, 4 - май и т.д.). Решить задачу в VC++.
C++ Сформировать матрицу размера M × N, у которой в каждом столбце содержатся все числа из исходного набора http://www.cyberforum.ru/cpp-beginners/thread325098.html
Есть задача Даны целые положительные числа M, N и набор из M чисел. Сформировать матрицу размера M × N, у которой в каждом столбце содержатся все числа из исходного набора (в том же порядке). предположим M=3 N=3 матрица но что значит набор из М чисел? исходя из логики матрица будет 3 3 3 3 3 3 3 3 3 та чтоли?
C++ Из массива A сформировать массив B Пожалуйста кто может помогите! В субботу экзамен - нужен допуск... а я не знаю как справиться с этой задачей((( уже не знаю к кому обратиться(( Задача в с++ "Для заданного массива A из M чисел сформируйте массив В из M/2 чисел по формуле: B(i) = (A(i) + A(M + 1 - i))/2. Предусмотрите случай когда M нечетно. " подробнее

Показать сообщение отдельно
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.06.2011, 11:54     Указатели
Цитата Сообщение от Evg Посмотреть сообщение
В современных многозадачных операционных системах каждая работающая программа, условно говоря, ничего не знает о других работающих программах и работает так, как будто она работает одна в однозадачной операционной системе. Это очень корявое объяснение на пальцах. Сказал к тому, что на данном этапе тебе не стОит этом вопросом заморачиваться - за тебя всё сделает операционная система
Это ты так кратко переформулировал мой пост?

Добавлено через 5 минут
Цитата Сообщение от Hagrael Посмотреть сообщение
Хм. Теперь у меня возник такой вопрос: Как вообще программа узнает, сколько байт имеет та или иная переменная? Вот к примеру код: Вот откуда программа узнает, что надо отбросить дробную часть? В самой переменной a ведь не хранится ее размер. По-моему, тип уже лежит в коде, и программе не надо узнавать его. То есть когда ты говоришь int a;, компилятор запоминает, что переменная a в данном скопе имеет тип int и в последствии в откомпилированном коде что-то меняется. То есть в коде не сказано
Ну так вот именно. Для статических переменных компилятор сразу запомнил их тип, к нему привязан рахзмер. А для указателей? Размер самого указателя в одной системе всегда один. А со сколькими байтами по хранимому в указателе адресу связан указатель под каждым именем?
C++
1
2
char *a;
float *b;
Со сколькими байтами связан a, а со сколькими b? Это определяется типом указтеля.

Добавлено через 1 минуту
Цитата Сообщение от Hagrael Посмотреть сообщение
А разве может быть по-другому?
Для другого исходника будет именно по другому. Например,
C++
1
2
char a;
a=((char)((int)5.5));
Добавлено через 6 минут
Цитата Сообщение от Hagrael Посмотреть сообщение
Но она же возвращает переменную с типом type*. А такие переменные называются указателями. Чем является адрес?
Нет. Она возвращает значение типа type *. Тип type * - указательный тип. А значение указателя - это адрес.

Добавлено через 3 минуты
Цитата Сообщение от Hagrael Посмотреть сообщение
То есть тип также хранится в ОЗУ?
Тип известен компилятору, в озу валяются сырые байты, интерпретировать их - задача прилады, а какими именно операциями это делается - определяет компил и вставляет в код прилады. Всё, с этого момента иначе эти байты именно это место прилады уже не интерпретирует.

Добавлено через 59 секунд
Цитата Сообщение от Hagrael Посмотреть сообщение
Если так, то у указателей какой-то специфический тип. Будь он int, double или каким-либо другим, все равно под него выделяется 2 блока памяти: число - размер типа; и число - адрес.
Размер подразумевается на этапе разработки, а не хранится. А адрес хранится.

Добавлено через 1 минуту
Цитата Сообщение от Hagrael Посмотреть сообщение
Так это приводит к ошибке потому, что там не выделена память или потому что та память не входит в допустимую для моей программы? Разве полное отсутствие "включенных" битов не свидетельствует просто о нуле? Если свидетельствует, то ошибки из-за того, что память не выделена, быть не должно.
Именно выделение памяти и делает эту память допустимой для всех твоих операций.

Добавлено через 1 минуту
Цитата Сообщение от Hagrael Посмотреть сообщение
о зачем тогда писать int* p=&a;, достаточно просто написать *p=&a;
C++
1
2
int p;//Как здесь определить, тип?
p=&a;
.

Добавлено через 4 минуты
Цитата Сообщение от pito211 Посмотреть сообщение
Но если ты с помощью new выделяешь память для неинтегральных типов, то там действительно кладётся некоторый заголовок, чтобы знать потом как удалять delet[]-ом
Каким бы ни был тип, он известен на этапе компиляции. При delete будет вызов своего деструктора и всего делов, а деструктор должне быть у любого класса. Если даже ты его не сделал, то компил сделает его неявно. Дополнительная инфа нужна только при указателям базовых классов при наследовании, да и то в она скорее всего в самом данном, а не в указателе.

Добавлено через 1 минуту
Цитата Сообщение от silent_1991 Посмотреть сообщение
Указатель должен вместить ровно такое число, сколько максимально блоков памяти мы можем адресовать, больше и не надо.
Причём, однобайтных.

Добавлено через 4 минуты
Цитата Сообщение от Hagrael Посмотреть сообщение
Вы имеете в виду, что выделенная память - это память, которая выделена для приложения или память, выделенная под переменные? Или это одно и то же, и термин "блок памяти, выделенный для приложения" всего лишь условный, и на самом деле приложению дается ровно столько байт, сколько нужно для его переменных (что вполне логично)?
Нет. Для кода память тоже выделяется, но этим система занимается полностью самостоятельно, явно же память выделяется только для динамичесих переменных. То есть во-первых только для перемнных, а во-вторых только для динамических. Оба признака сразу.

Добавлено через 4 минуты
Цитата Сообщение от Hagrael Посмотреть сообщение
Это, конечно, только мое предположение, как бы могла работать программа. Если компилятору известен тип переменной a, то он вполне сможет передать этот тип указателю p. Т. е. как бы компилятор сам допишет int перед записью *p=&a. Конечно, это глупо, гораздо лучше даже для программиста явно указать тип переменных, на которые может указывать указатель, но думаю, что логичнее в таком случае было бы использовать отдельный тип pointer без излишек типа int.
Нет. Указатель обозначается звёздочкой, нетипизированны тоже. Не хочешь указаывать тип данных? Эйси, указатель на void (пишется
C++
1
void *p;
) и никаких гвоздёв, а если специальное имя для указательного типа будет только мешать.

Добавлено через 3 минуты
Цитата Сообщение от Hagrael Посмотреть сообщение
Хм. Да, все манипуляции с типами проводятся еще компилятором, но разве компилятор не может сам добавить int (как написано выше)?
Может, именно это и называется выводом типов. Но лучше иметь приведение типов, то есть когда тебе надо переменнйо одного типа специально присвоить значение другого, а совмещение и вывода, и приведения грозит дополнительными сложностями в изучении такого языка.

Добавлено через 2 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
Hagrael, ваши предположения не верны, ничего никуда автоматически не подставляется. И, ещё раз, звёздочка при объявлении относится к типу, а не к переменной, так что ваше *p = &a; в принципе не верно, даже если забыть про то, что тип надо указывать. Выражение int *p = &a; нужно читать как (int *)p = &a; (скобки для понятности). Т.е. вот это int * и есть ваш тип pointer. А если писать p = &a;, как компилятор поймёт, что мы хотим работать с p как с указателем, а не как просто с целым числом? Конечно, он мог бы предположить что-то, но его предположение могло бы оказаться неверным. Указывая же тип явно, мы сообщаем, что переменная p является указателем на тип int (int *), и компилятор всё обработает верно.
Надёжность вывода, кстати, тоже фактор. Хотя и её можно обеспечить. Но сколько это займёт времени и насколько можно будет быть уверенным в том, что оно получилось надёжно?

Добавлено через 3 минуты
Цитата Сообщение от Hagrael Посмотреть сообщение
А выделенная под приложение память - это память, необходимая приложению, или же есть некий резерв?
А это тебе решать. Память, выделенаня для кода (самой программы), для статических переменных и для автоматических (автоматические в стеке валяются) выделяется точно в том количестве, сколько нужно. А динамическую ты сам можешьь резервировать. Например, нажен тебе массив на 10 элментов, а ты с запасом выделяешь 16 (ближайшую не меньшую стпень двойки), надо тебе 100, ты выделяешь 128 и делаешь это на случай, если потом вдруг окажется, что надо больше.

Добавлено через 1 минуту
Цитата Сообщение от Hagrael Посмотреть сообщение
Можно спрогнозировать, сколько памяти будет выделено для программы на помеченном этапе выполнения программы? Если подумать логично, то да, можно, и место будет равняться 8 байтам. Но может быть, ОС выделяет некоторый резерв для программы?
Из этого текста, как раз ясно только, что 8-ми байт не хватит. А сколько нужно не ясно. 8 байт на данные видно. А сколько на код?

Добавлено через 1 минуту
Цитата Сообщение от Chelioss Посмотреть сообщение
new? или вы имели ввиду, что нет в его коде?
new - динамичекое выделение памяти, а не динамическая декларация переменной.
 
Текущее время: 18:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru