Представлять указатель - PullRequest
0 голосов
/ 04 мая 2018

Если ListofChar - указатель на Char (не путайте с char), который представляет struct charact,
тогда что это значит ListofChar chars в void report(ListofChar chars)?
chars просто представляет указатель ListofChar?

#include <stdio.h>
#include <stlib.h>

struct charact {
     char ch;
     int occurs;
     struct charact *next;
     };

   typedef struct charact Char;
   typedef Char * ListofChar;
   typedef Char * CharNode_ptr;

  void letters(char name[50], ListofChar * chars_ptr);
  void report(ListofChar chars);
  Char * createnode(char ch);

 int main() {
      char name[50];
      ListofChar chars = NULL;
      scanf("%s", name);
      letters(name, &chars);
      report(chars);
      return 0;
      }
   Char * createnode(char ch) {
   CharNode_ptr newnode_ptr ;
   newnode_ptr = malloc(sizeof (Char));
   newnode_ptr -> ch = ch;
   newnode_ptr -> occurs = 0;
   newnode_ptr -> next = NULL;
   return newnode_ptr;
   }

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Этот ответ основан на моем понимании вашего вопроса, а именно: я думаю, что ваша проблема заключается в объявлении массива с использованием указателей и указателя.

Как вы знаете, каждая переменная - это ячейка памяти, и у каждой ячейки памяти есть свой адрес. Указатель любого данного типа содержит адрес ячейки памяти. Для вашего случая рассмотрим следующий пример.

struct charact * a;

мы определяем указатель 'a' типа 'struct charact', так как сейчас указатель 'a' содержит мусорное значение, и если вы попытаетесь присвоить ему что-то, вы получите ошибку, потому что когда вы присваиваете свою систему, вы переходите к 'a' принимает значение мусора и воспринимает его как адрес памяти, куда он должен поместить данное значение, что невозможно, поскольку адрес мусора, вероятно, вам не назначен. Чтобы присвоить значение в 'a', вы сначала должны инициализировать 'a' с помощью malloc () или любых других функций выделения памяти. При этом malloc () вернет вам адрес памяти, а затем вы сможете начать и присвоить значения «a».

Теперь перейдем к вашему вопросу: определение «a» может выступать в качестве массива или указателя на структуру. Это зависит от того, сколько памяти вы назначаете переменной с помощью malloc (). Возможно, вы бы присвоили значение следующим образом -

a = (struct charact *) malloc (sizeof (struct charact) * n)

если n> 1, то вы получите адрес памяти, который способен хранить больше, чем на struct charact, и, следовательно, будет работать как массив, и, если n = 1, вы можете хранить только один struct charact, и, следовательно, это единое целое.

0 голосов
/ 04 мая 2018

Да и нет.
Кажется, что код написан так, чтобы подразумевать разницу между «одним и тем же характером» и «многими частями».

Что-то вроде:

Char - это единое целое.
ListOfChar сам по себе является указателем на один Char, но это означает, что после него есть еще несколько. С некоторым способом идентификации последнего, это позволяет функции работать с несколькими, только с одним параметром. Даже не зная сразу, сколько их.

Существует еще одна похожая конструкция, которую вы не упоминаете в своем вопросе и которая помимо объявления, не используемого в показанном коде, CharNode_ptr. Если вы допустите какие-то чистые предположения, я бы предположил, что «больше следования» сверху реализовано в остальной части кода в виде связанного списка.
Смысл здесь немного другой (или просто более подробный), он предлагает дополнительные подробности того, что вы найдете «другие» характеристики по ссылке next внутри каждой структуры, при условии, что это не NULL.
Вполне вероятно, что код написан, чтобы НЕ подразумевать эту деталь при использовании идентификатора типа ListOfChar, например, в API (показаны прототипы) для функций.

Что-то вроде:

ListofChar означает:
«Эй, пользователь, не волнуйся, это как-то больше, чем один; но тебе не нужно знать, как именно».

CharNode_ptr означает:
«Эй, программист, помни, что ты имеешь дело со связанными списками.»

...