Форум программистов, компьютерный форум 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 нечетно. " подробнее

Показать сообщение отдельно
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.06.2011, 11:58     Указатели
Цитата Сообщение от Hagrael Посмотреть сообщение
Если так, то у указателей какой-то специфический тип. Будь он int, double или каким-либо другим, все равно под него выделяется 2 блока памяти: число - размер типа; и число - адрес. Таким образом, выходит, что указатель любого типа имеет одинаковый размер. Это так?
Так-то оно так, да не совсем по этой причине. Есть ведь такая штука, как указатель на массив - не забывайте об этом. Впрочем, когда вы его увидите, вы его не отличите от указателя на простую переменную:

C
1
2
char * ptr; // указатель на массив char или на одну переменную типа char?
int * array; // указатель на массив int или на одну переменную типа int?
Ответить можно и так, и так. Один и тот же указатель может хранить адрес любого по размеру куска памяти. Потому, что единственное, что он хранит - это адрес начала этого куска. А сколько там в нём байт - это уже совершенно не его дело. Тип перед указателем пишется для того, чтобы компилятор знал, каков размер одного элемента этого массива (даже если в нём всего один элемент - читай, просто переменная). Смотрите:

C
1
2
short array[8];
short * ptr = &array;
В памяти short array[8] выглядит так:

0A 1B C4 C8 14 00 08 42 38 31 AA 89 C1 F7 F8 F0 01 FF BC 04 0A 1B C4 C8 14 00 08 42

То есть мы знаем, что у нас есть массив, который имеет в себе 8 элементов, каждый размером sizeof(short), то есть у меня это 2 байта. И у нас есть адрес начала этого массива, скажем, 2048 (напишу в десятичной для наглядности). То есть адрес 5-го элемнта массива будет 2048 + (5 * sizeof(short) ) = 2048 + (5 * 2) = 2048 + 10 = 2058. И начиная с адреса 2058 нам надо считать 2 байта, чтобы прочитать этот элемент массива.

Зная это, компилятор может заранее сделать код для доступа к i-му элементу массива ( array[i] ). Вот формула: 2048 + ( i * 2 ). Если адрес на этапе компиляции не известен, но мы имеем указатель на начало этого массива, то можем сделать так: ptr + ( i * 2 ). Допустим, ptr содержит 3072, а i имеет значение 7. Дальше по аналогии: 3072 + 7 * 2 = 3072 + 14 = 3086. И начиная с адреса 3086 читаем 2 байта и получаем значение элемента ptr[i].

То есть компилятор, зная размер элемента массива (ну или тупо переменной), генерирует код для доступа к этой переменной, и, исходя из того же размера элемента, генерирует код считывания этого количества байт из памяти. На этапе выполнения нам просто не нужно знать тип переменной, весь необходимый код уже сгенерирован при компиляции.

А как вы думаете, почему можно легко сделать

C
1
printf( "%i", ptr[-1] );
? компилятор тупо сделает так: ptr + ( i * size ). Если ptr = 1024, i = -1, size = 4, то 1024 + (-4) = 1020 - арес начала -1 элемента массива. По этой же логке нумерация элементов массива начинается с нуля, то есть адрес начала первого элемента равен адресу начала массива: 1024 + (0 * 4) = 1024 + 0 = 1024. Вот и всё.
 
Текущее время: 07:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru