Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Использование указателей для копирования массива



Пример 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; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.045 с.)
Главная | Случайная страница | Обратная связь