Небезопасный код с использованием указателей (операции с массивами) - C#
Формулировка задачи:
Задан стековый массив А(N). Получить из него массив В(M), содержащий элементы массива А, кратные двум.
Помогите переделать код в небезопасный с использованием указателей.
вот код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.Write("Введите размер матрицы n: ");
int n = Convert.ToInt32(Console.ReadLine());
int[] A = new int[n];
Random rand = new Random();
for (int i = 0; i < n; i++)
{
A[i]=rand.Next(0,10);
Console.Write(A[i]);
}
Console.WriteLine();
int[] B = new int[1];
int k = 0;
for (int i = 1; i < n; i++)
{
if (A[i] % 2 == 0)
{
B[k] =A[i];
k++;
Array.Resize(ref B, k + 1);
}
}
for (int i = 0; i < k; i++)
Console.Write(B[i] + " ");
}
}
}Решение задачи: «Небезопасный код с использованием указателей (операции с массивами)»
textual
Листинг программы
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication30
{
class Program
{
unsafe static void Main ( string[] args )
{
int srcArrSize,
endArrSize;
int mod2 = 0;
Random rand = new Random();
Console.Write( "Введите размер матрицы n: " );
srcArrSize = Convert.ToInt32( Console.ReadLine() );
int* srcArr = (int*)Marshal.AllocHGlobal( srcArrSize * sizeof( int ) );
Console.Write( "Исходный массив:\t" );
for ( int i = 0; i < srcArrSize; ++i )
{
srcArr[i] = rand.Next( 0, 10 );
if ( srcArr[i] % 2 == 0 )
++mod2;
Console.Write( srcArr[i] + " " );
}
Console.WriteLine();
if ( mod2 == 0 )
{
Marshal.FreeHGlobal( (IntPtr)srcArr );
Console.WriteLine( "Нет элементов кратных 2." );
Console.ReadKey();
return;
}
endArrSize = mod2;
mod2 = 0;
int* endArr = (int*)Marshal.AllocHGlobal( endArrSize * sizeof( int ) );
int* temp = srcArr;
while ( mod2 != endArrSize )
{
if ( *temp % 2 == 0 )
endArr[mod2++] = *temp;
temp++;
}
Console.Write( "Элементы кратные 2:\t" );
for ( int i = 0; i < endArrSize; ++i )
Console.Write( endArr[i] + " " );
Marshal.FreeHGlobal( (IntPtr)srcArr );
Marshal.FreeHGlobal( (IntPtr)endArr );
Console.WriteLine();
Console.ReadKey();
}
}
}