新手对于链表定义*linklist的理解障碍

@[TOC]新手对于链表定义时*linklist的理解障碍

刚开始接触数据结构。学到链表时有定义

typedef struct Node
{
    DataType data;//数据域
    struct Node *next;//指针域
}Node,*linklist;

一直不理解,指针星号到底放在哪的具体规则。
typedef int *int_type;
怎么使用时,int_type j;就等于int *j;了呢?
我觉得typedef 应该这样用才对啊:
typedef int* int_type;

所以看到链表指针定义的时候很懵,
linklist L;怎么和Node *L;同等呢?
我觉得应该是*linklistNode等价,所以如之前的int *定义一样,也应该是错的,或者说我无法理解。

百度后知道,原来星号的位置在各种c编辑器设计之初就没有规定死。一说时为了减少错误率,没有要求定义或声明指针时 ,星号是否必须靠近数据类型或者变量名。这也是我在初学时并没有意识到的一点。

实际是
int *i等价于int* i等价于int * i
(这里可能代表的实际含义差别,习惯差别就不讨论了)

这里我误解有两个点:
1、将typedef 和#define 等同
2、*位置的理解

所以最后初学者可将其定义借助(仅仅是借助)
int i, *j; 声明整型i和整型指针j
int* i, j; 声明整型指针i和整型j
来理解。
故文首可改为

typedef struct Node{}Node;
typedef struct Node{}* linklist;

甚至

typedef struct Node{}Node,      *         linklist;

以及

typedef struct Node{}Node,(*linklist);

再加两点关于新手对typedef理解的方法(网上看到的,这里记录一下,加深理解)

1、注意转定义前后的差别
之前说连续声明时,int* i, j; 声明整型指针i和整型j,但是如果typedef int *inttype; inttype i,j;呢?这里结果其实相当于int *i,*j;

测试时给i赋值指针时正常,而给j赋值常数时直接报错,就不展示了。

2、不常见的转定义
typedef char **pp;
typedef int array[8];
当脑子不好使时,只需去掉typedef,看看剩下的句子是声明什么,那么,就知道再次使用重定义后的含义了。
比如上文pp可以声明一个指向指针的指针;
array可以声明容量为8的整型数组。
-完-

ps:另外,星号asterisk,指针pointer…

处女贴轻喷,希望大佬看到可以给点深入见解。


版权声明:本文为sinat_36090552原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。