Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Использование указателей для копирования массива ⇐ ПредыдущаяСтр 2 из 2
Пример 8.6. Использование указателей для копирования символьного массива.
#include "stdafx.h" using namespace System; String^ CharToString(char* pArrchar, int count) { // Функция преобразования строки в стиле C в строку String String^ st = ""; for (int i = 0; i < count; i++) st += (Char)*(pArrchar + i); // Копирование символов return st; } int main() { char s1[] = "cat"; // Объявление char s2[] = "dog"; // символьных массивов. char* p1 = s1; // Объявление указателей и их char* p2 = s2; // связывание с символьными массивами. Console::WriteLine( "s1='{0}' (p1=0x{1:X}), s2='{2}' (p2=0x{3:X})" , CharToString(p1, 3), (long)p1, CharToString(p2, 3), (long)p2); for (int i=0; i<4; i++) // Операция копирования строки s2 в s1. *(p1+i) = *(p2+i); // Теперь обе строки содержат "dog". Console::WriteLine("Выполнено копирование s2 в s1."); Console::WriteLine( "s1='{0}' (p1=0x{1:X}), s2='{2}' (p2=0x{3:X})" , CharToString(p1, 3), (long)p1, CharToString(p2, 3), (long)p2); Console::ReadLine(); return 0; } /* Вывод : s1='cat' (p1=0x12F0F4), s2='dog' (p2=0x12F0F8) Выполнено копирование s2 в s1. s1='dog' (p1=0x12F0F4), s2='dog' (p2=0x12F0F8) */
Пример 8.7. Использование указателей для копирования массива целых чисел.
#include "stdafx.h" using namespace System; void arrCopy(int source[], int sourceStart, int target[], int targetStart, int count) { // Фиксация переданных указателей положения в памяти массивов // источника и назначения, чтобы они не были изменены. int * pSource = source , * pTarget = target // Определение начальных точек копирования // в массивах источника и назначения. int * ps = pSource + sourceStart ; int * pt = pTarget + targetStart ; // Копирование конкретного количества байтов // из исходного массива в массив назначения. for (int i = 0; i < count; i++) { *pt = *ps; pt++; ps++; } } void main () { // Создание 2-х массивов заданного размера и их инициализация. const int SIZE = 100; int arr1[SIZE] = {0}, arr2[SIZE] = {0}; // Заполнение элементов массива arr 1 числами от 0 до 99. for (int i = 0; i < SIZE; i++) arr1[i] = i; // Вывод первых 10-ти элементов исходного массива arr 1. Console::Write("Первые 10 элементов исходного массива: "); for (int i = 0; i < 10; i++) Console::Write(arr1[i] + " "); Console::WriteLine(); // Копирование содержимого массива arr 1 в arr 2. arrCopy ( arr 1, 0, arr 2, 0, SIZE ); Console :: WriteLine ("Копирование всего массива."); // Вывод первых 10-ти элементов копии ( arr 2) Console :: Write ("Первые 10 элементов копии: "); for (int i = 0; i < 10; i++) Console::Write(arr2[i] + " "); Console :: WriteLine (); // Копирование содержимого последних 10 элементов массива arr 1 // в начало arr 2. Параметр start определяет откуда начинается // копирование в исходном массиве. int start = SIZE - 10; arrCopy(arr1, start, arr2, 0, SIZE - start); Console :: WriteLine ("Копирование последних 10 элементов " + "исходного массива в начало массива назначения."); // Вывод первых 10-ти элементов копии ( arr 2) Console::Write("Первые 10 элементов копии: "); for (int i = 0; i < 10; i++) Console::Write(arr2[i] + " "); Console::WriteLine(); Console::ReadLine(); return; } /* Вывод: Первые 10 элементов исходного массива: 0 1 2 3 4 5 6 7 8 9 Копирование всего массива. Первые 10 элементов копии: 0 1 2 3 4 5 6 7 8 9 Копирование последних 10 элементов исходного массива в начало массива назначения. Первые 10 элементов копии: 90 91 92 93 94 95 96 97 98 99 */
Ссылки (http://msdn.microsoft.com/ru-ru/library/dz43scw4.aspx)
Объявление ссылки имеет следующим синтаксис:
<Тип> &<Название_ссылки> = <Переменная>;
После создания ссылки ее название можно использовать в выражениях вместо названия переменной. Например:
int x = 10; // Объявление и инициализация переменной int &ref = x; // Объявление ссылки ref = 20; System::Console::Write ("x = {0}", x); // Вывод : x = 20 x = 30; System::Console::Write ("ref = {0}", ref); // Вывод : ref = 30
Пример 8.8. Передача параметров в функцию по ссылке с использованием указателей.
#include "stdafx.h" void func ( int * x ) { * x = * x * 2; } // Определение функции int main () { int у = 10; func (& y ); // Вызов функции с передачей адреса, а не значения System::Console::WriteLine("y = {0}", y); // Вывод : y = 20 System::Console::ReadLine (); return 0; }
Пример 8.9. Передача параметров в функцию с использованием ссылок.
#include "stdafx.h" void func(int &x) { x = x * 2; } // Определение функции int main() { int у = 10; func(y); // Вызов функции с передачей значения, а не адреса System::Console::WriteLine("y = {0}", y); // Вывод : y = 20 System::Console::ReadLine (); return 0; }
Очевидно, что выражение x = x * 2; выглядит более привлекательно, чем *х = *х * 2; .
Оператор sizeof (http://msdn.microsoft.com/ru-ru/library/4s7x1k91.aspx)
Формат двух типов оператора sizeof имеет вид:
Sizeof (type) Sizeof expression
Пример 8.10. Определение размера данных разного типа в байтах.
#include "stdafx.h" using namespace System; size_t getPtrSize(char *ptr) { return sizeof(ptr); } int main() { char arrchar[] = "Hello, world!"; // Массив символов типа char Console::WriteLine ("Размер переменной типа char: {0}", sizeof(char)); Console::WriteLine(" Длина строки ' Hello, world! ' в стиле C : {0}", sizeof arrchar); Console::WriteLine("Количество элементов массива arrchar: {0}", (sizeof arrchar) / (sizeof arrchar[0])); Console::WriteLine("Размер указателя: {0}", getPtrSize(arrchar)); size_t longSize = sizeof(long); // Размер данных типа long Console::WriteLine(" Размер переменной типа long: {0}", longSize); double x = 0, & ref = x ; // Объявление переменной и ссылки на нее Console::WriteLine("Размер переменной типа double: {0}", Sizeof ref ); Console::ReadLine(); return 0; } /* Вывод: Размер переменной типа char: 1 Длина строки "Hello, world!" в стиле C: 14 Количество элементов массива arrchar: 14 Размер указателя: 4 Размер переменной типа long: 4 Размер переменной типа double: 8 */
|
Последнее изменение этой страницы: 2019-04-19; Просмотров: 195; Нарушение авторского права страницы