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

Указатели. Не понимаю - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ вычисление наращенной суммы ренты с использованием операторов множественного выбора http://www.cyberforum.ru/cpp-beginners/thread737808.html
помогите,пожалуйста,ответить на вопрос в билете на экзамен,буду очень благодарна: программа,реализующая вычисление наращенной суммы ренты с использованием операторов множественного выбора(с помощью С++).
C++ как можно переделать программу? как можно переделать эту программу так, чтобы использовались функции класса string?) #include <iostream> using std::cout; using std::endl; int main() { http://www.cyberforum.ru/cpp-beginners/thread737785.html
C++ Вычислить и напечатать таблицу значений V для десяти различных значений радиусов R1, R2, ..., R10 трубы
Условие: Объемные расходы воды в секунду определяются по формуле: http://www.cyberforum.ru/attachments/cpp-beginners/215250d1355866277-1.jpg где R - радиус цилиндрической трубы, м; ню - динамическая вязкость жидкости, Па * с;l - длина части трубы, где можно считать, что дельта P - const, м;дельта P - падение давления жидкости в части трубы длиной l м, Па.Вычислить и напечатать таблицу...
Обработка элементов файла.Каждый отрицательный элемент в файле заменить результатом его целочисленного деления на 3 C++
Ввести файл F. Каждый отрицательный элемент в файле заменить результатом его целочисленного деления на 3. Файл вывести до и после преобразования. Я так поняла название файла пользователь должен задать сам. Помогите решить пожалуйста
C++ Помогите сделать блок-схему к лабораторной работе http://www.cyberforum.ru/cpp-beginners/thread737761.html
Помогите сделать блок-схему к этой лабе. Код прилагается :) Спасибо! В одномерном массиве {3.24, -7.16, 2.28, -0.16, -3.22, 7.14, 2.88, -3.20, 0.99, -4.15} вычислить: 1) сумму отрицательных элементов массива; 2) произведение элементов массива, расположенных между максимальным и минимальным элементами; 3) упорядочить элементы массива по возрастанию
C++ не мгу понять что заошибка #include <iostream> #include <clocale> #include <conio.h> #include <stdlib.h> #include <time.h> #include <fstream> #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 подробнее

Показать сообщение отдельно
WhiteP
605 / 203 / 23
Регистрация: 20.11.2012
Сообщений: 419
19.12.2012, 11:37     Указатели. Не понимаю
Позволю себе копипасту о массивах и указателях (источник - Стив Саммит "Язык Си в вопросах и ответах").

Кликните здесь для просмотра всего текста
2.1: В одном файле у меня есть описание char a[6] а в другом я объявил
extern char *a. Почему это не работает?

О: Декларация extern char *a просто не совпадает с текущим определением.
Тип "Указатель-на-тип-Т" не равен типу "массив-типа-Т". Используйте
extern char a[].

2.2: Но я слышал, что char a[] эквивалентно char *a.

О: Ничего подобного. (То, что Вы слышали, касается формальных параметров
функций, см. вопрос 2.4.) Массивы - не указатели. Объявление массива
"char a[6];" требует определенного места для шести символов, которое
будет известно под именем "a". То есть, существует место под именем
"a", в которое могут быть помещены 6 символов. С другой стороны,
объявление указателя "char *p;" требует места только для самого
указателя. Указатель будет известен под именем "p" и может указывать
на любой символ (или непрерывный массив символов).

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

char a[] = "hello";
char *p = "world";

породит структуры данных, которые могут быть представлены так:

+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+

+-----+ +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d |\0 |
+-----+ +---+---+---+---+---+---+

Важно понимать, что ссылка типа х[3] порождает разный код в
зависимости от того, массив х или указатель. Если взять приведенную
выше декларацию, то, когда компилятор встречается с выражением а[3],
он генерирует код, позволяющий переместиться к месту под именем "a",
перемещается на три символа вперед и затем читает требуемый символ.
В случае выражения p[3] компилятор генерирует код, чтобы начать с
позиции "p", считывает значение указателя, прибавляет к указателю
3 и, наконец, читает символ, на который указывает указатель. В нашем
примере и a[3] и p[3] оказались равны 'l', но компилятор получает
этот символ по-разному. (Смотри также вопросы 17.19 и 17.20.)

2.3: Тогда что же понимается под "эквивалентностью указателей и массивов"
в С?

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

"Эквивалентность" относится к следующему ключевому определению:

значение [см. вопрос 2.5] типа массив-Т, которое появляется
в выражении, превращается (за исключением трех случаев) в
указатель на первый элемент массива; тип результирующего
указателя - указатель-на-Т.

(Исключение составляют случаи, когда массив оказывается операндом
sizeof, оператора & или инициализатором символьной строки для
массива литер.)

Вследствие этого определения нет заметной разницы в поведении
оператора индексирования [], если его применять к массивам и
указателям. Согласно правилу, приведенному выше, в выражении типа
а[i] ссылка на массив "a" превращается в указатель и дальнейшая
индексация происходит так, как будто существует выражение с
указателем p[i] (хотя доступ к памяти будет различным, как описано в
ответе на вопрос 2.2). В любом случае выражение x[i], где х - массив
или указатель) равно по определению *((x)+(i)).

Смотри: K&R I Разд.5.3 c.93-6; K&R II Разд.5.3 c. 99; H&S
Разд.5.4.1 c. 93; ANSI Разд.3.2.2.1, Разд.3.3.2.1,
Разд.3.3.6 .
 
Текущее время: 13:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru