typedef 是重定义的意思,这里表示HuffmanCode是一个char**类型的代名词。
char*可以理解为指向一个字符串第一个字符的指针。
char**可以理解为字符串数组,
char **a = new char* [10];
for (int i = 0; i < 10; i++) a[i] = new char [30];
这就创建了一个a,a[n]代表第n+1个字符串,a[n][m]表示第n+1个字符串的第m+1个字符。
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
} HTNode,*HuffmanTree;
是用HTNode表示这个结构体,HuffmanTree表示这个结构体的指针类型。这样使用HTNode 定义的变量是结构体类型(空间为4*int=16),而用HuffmanTree定义的是可以指向这种结构体的指针(空间为long=4),HuffmanTree与HTNode*等价。
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode))
HT=(HTNode*)malloc((m+1)*sizeof(HTNode))
下面是调用的例子:
HTNode a;
HuffmanTree b;
a.lchild=0;
b=&a;
b->lchild=0;
calloc也用于动态分配内存,和malloc稍有区别,百度你就知道。
您好,您的问题是不是有点略多,下面一一为您解答:
1、typedef char **HuffmanCode 实际上是typedef (char *) *HuffmanCode。写成这种形式更好理解, **HuffmanCode是指向指针的指针,这里也可以理解为是指向字符串的指针,因为char*字符数组相当于字符串。
2、*HuffmanTree表示指向结构体HTNode的指针,HTNode是typedef语法指定的结构体的别名,然后*HuffmanTree是在定义结构体的同时定义了指向结构体的指针。
3、指针只是一个地址,HuffmanTree作为结构体指针同样是一个地址,因此不存在它内部有4个变量一说。严格意义上讲是HuffmanTree这个指针指向的结构体中有这4个变量,而这4个变量和在main函数里定义的普通变量一样,都占用实际内存,在新建结构体的同时为这4个变量分配内存空间。
4、HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode))。这个是malloc的语法,该语句的含义是分配m+1个HTNode结构体占用的内存,将分配的内存地址赋给HT。sizeof作用是判断某个类型所占用的内存空间,此处是计算HTNode占用的空间大小,然后(m+1)*sizeof(HTNode)表示m+1个HTNode,malloc是请求分配内存,(HuffmanTree)是强制类型转化,将得到的内存地址强制转化为HuffmanTree(即HTNode指针类型)。
5、malloc是C语言中常用的动态分配内存的语法,划重点“动态”,当你需要动态申请内存时(例如给数组扩容,还有此处的为结构体申请空间)时用到该语法,C语言中内存相关语法还有realloc,free可以自行了解一下。在C++中new和delete更为常用。
char **是指向指针的指针
HuffmanTree既不是变量也不是地址,是定义的一个别名,注意看struct前面还有一个typedef ,所以HuffmanTree是这个struct的指针的别名,所以HuffmanTree HT就可以看作是HTNode *HT。
malloc是动态分配内存空间,在你事先不知道要分配多大空间的时候使用
比如
struct LNode{
element data;
struct LNode *next;
}*Linklist;
LNode是结构变量名;
Linklist就是指针,指向该结构体的指针。
调用内部应为:结构变量名.成员名
malloc()分配一个内存单元 然后把这个单元的首地址赋给一个指针。HuffmanTree HT;只是定义一个HTNode的指针并没有给HT分配内存,所以必须用malloc给它分配一块内存!