char* strchr(char *str, char ch)
{
    for (;*str != '\0'; ++str)
    {
        if(*str == ch)
	  {
            return str;
        }
    }
    return NULL;
}
Задача №3: Напишите код для поиска второго вхождения символа в строку. Этот код должен использовать функцию strchr и не должен содержать циклов.char *first;
char *second = NULL;
first = strchr(str, ch);
if (first != NULL)  < - если first указывает на NULL - это значит, что символ ch не был найден и искать его второе вхождение не нужно
{
    second = strchr(first+1, ch); < -  здесь мы передаем в качестве параметра указатель на элемент строки, следующий за первым вхождением символа ch
}
Задача №4: В языке C++, в отличие от C, невозможно скомпилировать вызов функции, объявление (или определение) которой недоступно в момент компиляции.foo(int a); - объявление функции foo
 foo('a'); - вызов
  
  В этом случае компилятор сделает предположение о типе аргумента,приняв его за char.
 int **M = new int*[N];
 int *tmp = new int[N*N];
 for (int i = 0; i < N; ++i)
 {
     M[i] = tmp + i*N;
 }
  
 
 Задача №6: Напишите код, который освобождает память, выделенную в предыдущей задаче.
 delete[] tmp;
 delete[] M;
 
в случае если переменная tmp не видна в момент удаления,то освобождать память нужно следующим образом:
delete[] M[0];
delete[] M;
В этой ситуации порядок вызовов функции delete должен быть именно такой, т.к после удаления массива M мы не можем обратиться к его нулевому элементу M[0].
int *array = new int[size];
array[i] = ...
...
delete[] array;
Array a(10);Шаг 1:
В файле array.h заведем класс Array c 2 полями:class Array
{
    int mySize;        < - размер массива
    int *myData;        < - массив
}; 
Note: Хорошим стилем считается в своих классах имена всех переменных начинать с "my", чтобы не возникало путаницы своих и чужих классов Array a; ... = a.mySize; a.myData = ...Таким образом мы решили задачу №3: не перепутать размер массива.
Шаг 2:
Теперь добавим в наш класс специальные методы: конструктор и деструктор.Array( int size); < - конструктор ~Array(); < - деструкторКонструктор будет корректно отводить место в памяти под объект и инициализировать переменные класса. Деструктор будет вызываться автоматически при удалении объекта, например, при закрытии фигурных скобок, в которых был инициализирован объект, и правильно освобождать память.
Array :: Array(int size)
{
    mySize = size;
    myData = new int[mySize];
}
Array :: ~Array()
{
    delete[] myData;
}
С спомощью конструктора и деструктора мы решили проблемы 1 и 4.Шаг 3:
Для решения проблемы корректного обращения к элементам массива напишем методы get и set, которые будут проверять, что действия "положить элемент в массив" и "получить элемент из массива" обращаются к индексам в пределах массива.
int Array :: getValue(int index)
{
    if((index < 0) || (index >= mySize))
    {
        return -1;
    }
    return myData[index];
}
void Array :: setValue(int index, int value)
{
    if ((index < 0) || (index >= mySize))
    {
        return ;
    }
    myData[index] =  value;
}
Comments: внутри if в методах get и set подразумевается любое адекватное действие для случая некорректного обращения к массиву.Шаг 4: Права доступа.
У всех членов класса (члены класса - поля и методы) есть права доступа.По умолчанию все они private, т.е. доступны только внутри своего класса.
class Array
{
private:
    int mySize;
    int *myData;
public:
    Array();
    ~Array();
    int getValue(int index);
    void setValue(int index ,int ch);
};
Note: Хороший стиль программирования подобных классов подразумевает объявление всех полей как private, а всех методов как public.
int Array :: getSize()
{
    return mySize;
}
 Comments:единственный минус в выделении функции getSize()  вместо прямого обращения - это быстродействие. Мы позже обсудим, что с этим делать.
class Array
{
private:
    int mySize;
    int *myData;
public:
    Array();
    ~Array();
    int getValue(int index);
    void setValue(int index ,int ch);
    int getSize(); 
};
Array :: Array(int size)
{
    mySize = size;
    myData = new int[mySize];
}
Array :: ~Array()
{
    delete[] myData;
}
int Array :: getValue(int index)
{
    if((index < 0) || (index >= mySize))
    {
        return -1;
    }
    return myData[index];
}
void Array :: setValue(int index, int value)
{
    if ((index < 0) || (index >= mySize))
    {
        return ;
    }
    myData[index] =  value;
}
int Array :: getSize()
{
    return mySize;
}