2.3.7 Указатели и Вектора

2.3.7 Указатели и Вектора

Указатели и вектора в С++ связаны очень тесно. Имя вектора можно использовать как указатель на его первый элемент, поэтому пример с алфавитом можно было написать так:

char alpha[] = «abcdefghijklmnopqrstuvwxyz»; char* p = alpha; char ch;

while (ch = *p++) cout «„ chr(ch) „« " = " «« ch «« « = 0“ «« oct(ch) «« « “;

Описание p можно было также записать как

char* p = amp;alpha[0];

Эта эквивалентность широко используется в вызовах функций, в которых векторный параметр всегда передается как указатель на первый элемент вектора. Так, в примере

extern int strlen(char*); char v[] = «Annemarie»; char* p = v; strlen(p); strlen(v);

функции strlen в обоих вызовах передается одно и то же значение. Вся штука в том, что этого невозможно избежать; то есть не существует способа описать функцию так, чтобы вектор v в вызове функции копировался (#4.6.3). Результат применения к указателям арифметических операций +, -, ++ или – зависит от типа объекта, на который они указывают. Когда к указателю p типа T* применяется арифметическая операция, предполагается, что p указывает на элемент вектора объектов типа T; p+1

означает следующий элемент этого вектора, а p предыдущий элемент. Отсюда следует, что значение p+1 будет на sizeof(T) больше значения p. Например, выполнение

main() (* char cv[10]; int iv[10];

char* pc = cv; int* pi = iv;

cout «„ "char* " „« long(pc+1)-long(pc) «« « “; cout «« "int* " «« long(ic+1)-long(ic) «« « “; *)

дает

char* 1 int* 4

поскольку на моей машине каждый символ занимает один байт, а каждое целое занимает четыре байта. Перед вычитанием значения указателей преобразовывались к типу long с помощью явного преобразования типа (#3.2.5). Они преобразовывались к long, а не к «очевидному» int, поскольку есть машины, на которых указатель не влезет в int (то есть, sizeof(int)«sizeof(long) ).

Вычитание указателей определено только тогда, когда оба указателя указывают на элементы одного и того же вектора (хотя в языке нет способа удостовериться, что это так). Когда из одного указателя вычитается другой, результатом является число элементов вектора между этими указателями (целое число). Можно добавлять целое к указателю или вычитать целое из указателя; в обоих случаях результатом будет значение типа указателя. Если это значение не указывает на элемент того же вектора, на который указывал исходный указатель, то результат использования этого значения неопределён. Например:

int v1[10]; int v2[10];

int i = amp;v1[5]– amp;v1[3]; // 2 i = amp;v1[5]– amp;v2[3]; // результат неопределен

int* p = v2+2; // p == amp;v2[2] p = v2-2; // p неопределено

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

1.11 Вектора

Из книги C++ автора Хилл Мюррей

1.11 Вектора Встроенное в С++ понятие вектора было разработано так, чтобы обеспечить максимальную эффективность выполнения при минимальном расходе памяти. Оно также (особенно когда используется совместно с указателями) является весьма универсальным инструментом для


1.17 Полиморфные Вектора

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

1.17 Полиморфные Вектора У вас есть другая возможность – определить ваш векторный и другие вмещающие классы через указатели на объекты некоторого класса: class common (* //... *); class vector (* common** v; //... public: cvector(int); common* amp; elem(int); common* amp; operator[](int); //... *);Заметьте, что поскольку в таких


2.3.5 Указатели

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М


2.3.6 Вектора

Из книги C++. Сборник рецептов автора Диггинс Кристофер


5.5.5 Вектора Объектов Класса

Из книги C++ для начинающих автора Липпман Стенли

5.5.5 Вектора Объектов Класса Чтобы описать вектор объектов класса, имеющего конструтор, этот класс должен иметь конструктор, который может вызваться без списка параметров. Нельзя использовать даже парметры по умолчанию. Например:table tblvec[10];будет ошибкой, так как для


7.2.4 Указатели

Из книги Новый ум короля [О компьютерах, мышлении и законах физики] автора Пенроуз Роджер

7.2.4 Указатели Если производный класс derived имеет открытый базовый класс base, то указатель на derived можно присваивать перменной типа указатель на base не используя явное преобразовние типа. Обратное преобразование, указателя на base в указтель на derived, должно быть явным.


Вектора, допускающие сложение

Из книги QT 4: программирование GUI на С++ автора Бланшет Жасмин

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


8.4.1 Протоколы вектора расстояния

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

8.4.1 Протоколы вектора расстояния Самый простой протокол для сравнения маршрутизаторов использует счет попаданий между конечными точками пути. Некоторые улучшенные варианты оценивают стоимость или вес каждого из участков по пути следования. Например, участок попадания


6.3. Копирование вектора

Из книги автора

6.3. Копирование вектора ПроблемаТребуется скопировать содержимое одного vector в другой.РешениеИмеется пара способов сделать это. Можно при создании vector использовать конструктор копирования, а можно использовать метод assign. Пример 6.3 показывает оба этих способа.Пример 6.3.


11.8. Представление динамического числового вектора

Из книги автора

11.8. Представление динамического числового вектора ПроблемаТребуется иметь тип для манипулирования динамическими числовыми векторами.РешениеВы можете использовать шаблон valarray из заголовочного файла <valarray>. Пример 11.15 показывает, как можно использовать шаблон


11.9. Представление числового вектора фиксированного размера

Из книги автора

11.9. Представление числового вектора фиксированного размера ПроблемаТребуется иметь эффективное представление числовых векторов фиксированного размера.РешениеВ программном обеспечении обычного типа часто более эффектный результат по сравнению с valarray дает


11.11. Вычисление нормы вектора

Из книги автора

11.11. Вычисление нормы вектора ПроблемаТребуется найти норму (т. е. длину) числового вектора.РешениеМожно использовать функцию inner_product из заголовочного файла <numeric> для умножения вектора на самого себя, как показано в примере 11.21.Пример 11.21. Вычисление нормы вектора#include


3.3. Указатели

Из книги автора

3.3. Указатели Указатели и динамическое выделение памяти были вкратце представлены в разделе 2.2. Указатель – это объект, содержащий адрес другого объекта и позволяющий косвенно манипулировать этим объектом. Обычно указатели используются для работы с динамически


Указатели

Из книги автора

Указатели Указатель в С++ — это переменная, содержащая не сам объект, а адрес памяти, где располагается объект. Java и C# имеют аналогичную концепцию «ссылки» при другом синтаксисе. Мы начнем с рассмотрения придуманного нами примера, иллюстрирующего применение указателей:01


Указатели

Из книги автора

Указатели Указатель - это ячейка памяти, хранящая адрес. В PascalABC.NET указатели делятся на типизированные (содержат адрес ячейки памяти данного типа) и бестиповые (содержат адрес оперативной памяти, не связанный с данными какого-либо определенного типа).Тип указателя на