老同志,旧问题!

yxlchw 2004-04-02 09:13:54
请先看如下代码:
#define BITS 15
#define MAX_CODE ( ( 1 << BITS ) - 1 )
#define TABLE_SIZE 35023L
#define TABLE_BANKS ( ( TABLE_SIZE >> 8 ) + 1 )
#define END_OF_STREAM 256
#define BUMP_CODE 257
#define FLUSH_CODE 258
#define FIRST_CODE 259
#define UNUSED -1

struct dictionary {
int code_value;
int parent_code;
char character;
} *dict[ TABLE_BANKS ];

#define DICT( i ) dict[ i >> 8 ][ i & 0xff ]

这是我在LZW算法中看到的代码片段,让我不能理解的是“#define DICT( i ) dict[ i >> 8 ][ i & 0xff ]”这一句,宏定义DICT(i)等价于dict[ i >> 8 ][ i & 0xff ],是个二维下标,但*dict[TABLE_BANKS ]定义的是一维呀,可这个程序编译是正确的。应该如何理解这句宏定义?
...全文
31 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
psbeond 2004-04-02
  • 打赏
  • 举报
回复
按宏展开就行
langjifengyu 2004-04-02
  • 打赏
  • 举报
回复
定义的是一个指针数组啊
指针数组这样表示完全可以的啊
例如:
int *a[2],b[2][2];
在这个指针数组里面
a[0]就代表的是B数组的第一行
A[1]代表的是B数组的第2行
a[0]+1就是第一行第2列的元素了
运用指针数组的目的是为了节省内存空间
因为他完全可以有多少存多少,不必浪费
尤其在指向字符串的指正数组
字符串大小不一
而指针数组是++循环,当字符串没了
他也就自动到下一行,
psbeond 2004-04-02
  • 打赏
  • 举报
回复
按宏展开就行
wshcdr 2004-04-02
  • 打赏
  • 举报
回复
我试试

#define BITS 15
#define MAX_CODE ( ( 1 << BITS ) - 1 )
#define TABLE_SIZE 35023L
#define TABLE_BANKS ( ( TABLE_SIZE >> 8 ) + 1 )
#define END_OF_STREAM 256
#define BUMP_CODE 257
#define FLUSH_CODE 258
#define FIRST_CODE 259
#define UNUSED -1

struct dictionary {
int code_value;
int parent_code;
char character;
} *dict[ TABLE_BANKS ];

#define DICT( i ) dict[ i >> 8 ][ i & 0xff ]

首先dict[ TABLE_BANKS ]
是定义了一个结构指针数组

然后#define DICT( i ) dict[ i >> 8 ][ i & 0xff ]
这里dict[i>>8]就是定址到一个指针上,该指针指向一个结构
那后面的[ i & 0xff ]应该是指到该结构中的一个成员上

以上推测,仅供参考!
zxl_lim 2004-04-02
  • 打赏
  • 举报
回复
是个指针数组嘛.
w3guy 2004-04-02
  • 打赏
  • 举报
回复
*dict[ TABLE_BANKS ] 是个指向指针的数组,可以用二维下标表示。

比如 char* str[2], 你可以用str[0][0] 表示第一个字符。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧