Найдите длину цепочек указателей в C?

Я балуюсь с указателями в C и создал указатель Pac-Man Inky пример.

int

          ********
      ****************
      ****************
    ********************
    ********************
  *******  * **  * *******
  *******    **    *******
  *******    **    *******
  ************************
****************************
****************************
****************************
****************************
****************************
****************************
****  ******    ******  ****
****  ******    ******  ****
**      ****    ****      **
**      ****    ****      **

inky;

Вопрос

Есть ли способ программно определить длину цепочки указателей Inky (в настоящее время 386)?

Как вы думаете, есть ли способ для : int ****inky ? За исключением переводчика с языка, который может знать.

Ptit Xav 09.04.2022 17:15

Поздравляем, теперь вы программист триста восемьдесят шесть звезд.

Nate Eldredge 09.04.2022 21:41
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не думаю, что есть способ сделать это для совершенно произвольного числа *, но если у вас есть фиксированное максимальное число, вы можете написать длинный _Generic выбор, чтобы сделать это.

#define COUNT_STARS(p) \
    _Generic(p,        \
        int : 0,       \
        int * : 1,     \
        int ** : 2,    \
        /* etc.... */  \
    )

И вы можете использовать приемы препроцессора для создания такого макроса, используя только O(log2(n)) строк исходного кода:

#include <stdio.h>

#define PTR0 *
#define PTR1 PTR0 PTR0
#define PTR2 PTR1 PTR1
#define PTR3 PTR2 PTR2
#define PTR4 PTR3 PTR3
#define PTR5 PTR4 PTR4
#define PTR6 PTR5 PTR5
#define PTR7 PTR6 PTR6
#define PTR8 PTR7 PTR7

#define GEN0(T, stars, n) T stars : (n)
#define GEN1(T, stars, n) GEN0(T, stars, (n)) , GEN0(T, stars PTR0 , (n)+(1 << 0))
#define GEN2(T, stars, n) GEN1(T, stars, (n)) , GEN1(T, stars PTR1 , (n)+(1 << 1))
#define GEN3(T, stars, n) GEN2(T, stars, (n)) , GEN2(T, stars PTR2 , (n)+(1 << 2))
#define GEN4(T, stars, n) GEN3(T, stars, (n)) , GEN3(T, stars PTR3 , (n)+(1 << 3))
#define GEN5(T, stars, n) GEN4(T, stars, (n)) , GEN4(T, stars PTR4 , (n)+(1 << 4))
#define GEN6(T, stars, n) GEN5(T, stars, (n)) , GEN5(T, stars PTR5 , (n)+(1 << 5))
#define GEN7(T, stars, n) GEN6(T, stars, (n)) , GEN6(T, stars PTR6 , (n)+(1 << 6))
#define GEN8(T, stars, n) GEN7(T, stars, (n)) , GEN7(T, stars PTR7 , (n)+(1 << 7))
#define GEN9(T, stars, n) GEN8(T, stars, (n)) , GEN8(T, stars PTR8 , (n)+(1 << 8))

#define COUNT_STARS(T, expr) _Generic(expr, GEN9(T, , 0))

int

          ********
      ****************
      ****************
    ********************
    ********************
  *******  * **  * *******
  *******    **    *******
  *******    **    *******
  ************************
****************************
****************************
****************************
****************************
****************************
****************************
****  ******    ******  ****
****  ******    ******  ****
**      ****    ****      **
**      ****    ****      **

inky;

int main(void) {
    printf("%d\n", COUNT_STARS(int, inky));
    return 0;
}

Попробуйте богболт

Эта версия обрабатывает до 511 *s. Вы можете легко расширить его, но время компиляции становится чрезмерным.

Другие вопросы по теме