Указатели на структуру C

#c #pointers #struct

#c #указатели #структура

Вопрос:

Задана структура по умолчанию:

 struct counter {
  long long counter;
};    

struct instruction {
  struct counter *counter;
  int repetitions;
  void(*work_fn)(long long*);
};

static void increment(long long *n){
  n  ;
}
  

Моя строка:

 n = 2;
struct counter *ctest = NULL;

int i;
if( ctest = malloc(sizeof(struct counter)*n){
  for( i=0; i<n ;i  ){
    ctest[i].counter = i;
  } 

  for( i=0; i<n ;i  ){
    printf("%lldn", ctest[i].counter);
  }
}

struct instruction itest;

itest.repetitions = 10;
itest.counter = ctest; //1. This actually points itest.counter to ctest[0] right?
                       //2. How do I actually assign a function?    

printf("%dn", itest.repetitions);
printf("%lldn", itest.counter.counter); // 3. How do I print the counter of ctest using itest's pointer?
  

Итак, я пытаюсь заставить эти три вещи работать.

Спасибо

Комментарии:

1. Все в порядке, исправлена большая часть ошибок из предоставленной справки, спасибо

2. P.S. @Jono Будет лучше проголосовать за полезные ответы и ответить, что вы приняли 🙂

Ответ №1:

itest.counter = ctest; // Это фактически указывает itest.counter на ctest[0], верно?

Правильно. itest.counter == amp;ctest[0] . Кроме того, itest.counter[0] ссылается непосредственно на первый объект ctest, itest.counter[1] ссылается на второй и т.д.

Как мне на самом деле назначить функцию?

 itest.work_fn = increment;
  

Как мне
выведите счетчик ctest с помощью
указатель itest?

 printf("%lldn", itest.counter->counter); // useful if itest.counter refers to only one item
printf("%lldn", itest.counter[0].counter); // useful if itest.counter refers to an array
  

Комментарии:

1. Как я мог бы передать n при увеличении функции? itest.work_fn = приращение (n); ?

2. @Jono: Вы не передаете аргумент во время назначения, а просто адрес, с которого начинается код функции. Вы передаете аргумент, когда вызываете его косвенно, через указатель: itest.work_fn(n) .

3. @Jono — Обратите внимание, что ваша рабочая функция принимает указатель на long long , а не на длинный long . Итак, вы должны вызвать это: itest.work_fn(amp;n); Также обратите внимание, что в вашей increment функции есть ошибка — она изменяет локальный аргумент, но не имеет видимого побочного эффекта. Я думаю, вы имели в виду static void increment(long long *n){ (*n) ; }

Ответ №2:

  1. Это указывает на адреса ctest. (который совпадает с адресом его первого элемента)
  2. Вы должны объявить некоторую функцию с тем же именем подписи (скажем void f(long long *) ) и здесь написать itest.work_fn = f;
  3. for(int i = 0; i < n; i) printf("%lldn", itest.counter[i].counter);

Комментарии:

1. статическое приращение пустоты (long long *n){ n ; } Скажите, хочу ли я использовать эту функцию? itest.work_fn = increment //Что насчет n? как мне это передать?

2. Вы можете вызвать itest.work_fn(n); , и это увеличит ваше число n.

Ответ №3:

Да, это так. Но, может быть, это более понятно следующим образом:

 iter.counter = amp;ctest[0];

itest.work_fn = increment;

printf("%lldn", itest.counter->counter);
  

Это если вы планируете иметь только один счетчик. Из вашего кода вам нужно несколько, и, возможно, вам следует сохранить число в инструкции struct.
Если это так, то это было бы:

 for (i = 0; i < itest.n; i  )
    printf("%lldn", itest.counter[i].counter);
  

В этом случае функция также должна быть изменена.