Испытайте себя с помощью этих крошечных твистеров программирования

C Language пережил долгий путь с момента своего создания и по-прежнему остается сильным в эпоху, когда доминировали его урбанистические собратья, известные как языки более высокого уровня. Хотя кажется, что другие языки программирования узурпировали прежние ниши предметной области, которые были оплотом C, этот старинный язык программирования все еще переживает все превратности, с которыми сталкивается разработка программного обеспечения. Многие языки и компиляторы более высокого уровня действительно построены на прочном фундаменте, который обеспечивает C ; они написаны на С.

В то время как C, кажется, ослабляет свою хватку в области приложений, где он действительно сияет, так это в области систем. Мириады системных программ по-прежнему написаны на языке Си.

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

  1. Указатель на указатель на что???

Рассмотрим следующие объявления.

char a [11][11];
char *a[11];
char (*a)[11];
char **a;

Большое дело? Ждать!!

Предположим, я ввожу 10 строк по 10 байт, как вы выделяете память и сохраняете строки в каждом из типов объявлений?

Теперь измените тип данных на int. Как вы теперь будете хранить целые числа? Ребята, вам нравится Киану Ривз в фильме Матрица?

Хорошо, давайте немного украсим это. Также объясните, как организована память с каждым типом объявления и длиной шага при разборе.

2. Дразнящая структура данных

Рассмотрим это заявление.

struct data {
int len;
char *buf;
};

Предположим, я говорю вам написать функцию, в которую я передаю строку и ее длину, можете ли вы сохранить данные в структуре?

void store_data (int len, char *str)
{
struct data *ps;
}

Таким образом, вы делаете два распределения здесь. Одно выделение для указателя ps и другое выделение для ps-›str (размером len).

Вот вопрос. Можете ли вы спроектировать структуру данных, в которой можно хранить одни и те же данные с помощью одного распределения (одного malloc)?

3. Полигамия запрещена

Легкая головоломка. Предположим, что это целочисленный несортированный массив. Массив содержит повторяющиеся записи (ровно 2) для каждого значения, но для одного члена, который является единственным. Можете ли вы найти неповторяющийся элемент, пройдя по массиву только один раз?

4. Немного утомительно

Предположим, целочисленный шаблон, например 01110011. Вам нужно переключить биты со 2-й позиции на 5-ю позицию. Таким образом, шаблон становится 01101101. Можно ли добиться этого с помощью одного оператора C?

void toggle_bits(int n, int p, int q), где n — 8-битное целое число, p — начальная позиция, а q — конечная позиция. Будьте готовы к тому, что другие биты должны остаться прежними!!

Пожалуйста, введите свои ответы в разделе комментариев ниже. Давайте проведем здоровую дискуссию и попробуем сохранить дух «C» ярким. Я надеюсь, что вопросы обоснованы и не содержат двусмысленности. Если вы найдете какую-либо двусмысленность, пожалуйста, поправьте меня.