打印

c语言指针问题,求教各位高手..

[复制链接]
3088|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjswuyunbo|  楼主 | 2010-1-11 19:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
const unsigned char shu_shuru_hz[32]=
{0x44,0xF4,0x4F,0xE4,0x44,0x64,0x90,0x98,0x94,0x93,0x14,0x98,0x08,0xD0,
0x10,0x00,0x04,0x04,0x04,0xFF,0x02,0x02,0xFF,0x4A,0x8A,0x7F,0x00,0x3F,0x80,0xFF,0x00,0x00};/*"输",2*//* (16 X 16 , 宋体 )*/
const unsigned char ru_shuru_hz[32]=
{0x00,0x00,0x00,0x00,0x01,0x83,0x76,0x18,0x60,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x40,0x20,0x10,0x08,0x06,0x01,0x00,0x00,0x00,0x00,0x03,0x04,0x18,0x30,0x10,0x00};/*"入",3*//* (16 X 16 , 宋体 )*/
const unsigned char mi_mima_hz[32]=
{0x00,0x58,0x24,0x04,0xF4,0x04,0x8D,0xB6,0x44,0x34,0xCC,0x94,0x24,0xCC,
0x04,0x00,0x02,0x06,0x02,0x79,0x41,0x41,0x41,0x7D,0x41,0x41,0x41,0x40,0x78,0x00,0x00,0x00};/*"密",4*//* (16 X 16 , 宋体 )*/
const unsigned char ma_mima_hz[32]=
{0x02,0x82,0xE2,0x5E,0x42,0xC2,0x00,0x02,0xFA,0x82,0x82,0x82,0xFE,0x80,
0x00,0x00,0x01,0x00,0x7F,0x10,0x10,0x3F,0x00,0x04,0x04,0x04,0x44,0x84,0x40,0x3F,0x00,0x00};/*"码",5*//* (16 X 16 , 宋体 )*/




const unsigned char *const pstring[4]={shu_shuru_hz,ru_shuru_hz,mi_mima_hz,ma_mima_hz,0};

void ShowString(unsigned char *string)
{
       while(*string)
PutOneChinese(*string);

}


比如 PutOneChinese(shu_shuru_hz);是可以正确的输出汉字的。
但是不知道该怎么样用ShowString(unsigned char *string)来输出连续的汉字。
比如   我想实现ShowString(pstring);可以输出四个汉字。

但是ShowString()里面的形参不知该如何定义?是用指针的指针还是指向数组的指针?
const unsigned char *const pstring[4]={shu_shuru_hz,ru_shuru_hz,mi_mima_hz,ma_mima_hz,0};
上面这个定义是不是也有问题??
弄了整整一天都不行,只能请教各位高手了。。。
请大家指教一下!!!

相关帖子

沙发
原野之狼| | 2010-1-11 22:18 | 只看该作者
const unsigned char *const pstring[4]={shu_shuru_hz,ru_shuru_hz,mi_mima_hz,ma_mima_hz,0};
四个元素的数组 初始化怎么有5个值呢

使用特权

评论回复
板凳
zjswuyunbo|  楼主 | 2010-1-11 22:50 | 只看该作者
呵呵,楼上这个是笔误。。。。
pstring[5]

使用特权

评论回复
地板
lanmp| | 2010-1-11 23:00 | 只看该作者
这个,要是我的话只能多穿一个参数,或者在数组最后补0。

使用特权

评论回复
5
mohanwei| | 2010-1-12 08:41 | 只看该作者
字库排序,并做成索引+点阵的方式。
显示的时候LCD_Disp("哈哈哈,今天天气真好");
在显示函数内部先查找索引,找到编号后再到点阵库里提取点阵……

使用特权

评论回复
6
冷漠| | 2010-1-12 10:47 | 只看该作者
本帖最后由 冷漠 于 2010-1-13 20:52 编辑

菜鸟提供参考: ( 高手见笑了。)
const unsigned char *pstring[4]={shu_shuru_hz,ru_shuru_hz,mi_mima_hz,ma_mima_hz,0};

char const  **string_ptr=pstring;
1、
......
do{
ShowString( *string_ptr ) ;
}while( *++string_ptr != NULL );

2、
......
for ( string_ptr=pstring ;  *string_ptr!= NULL ;  string_ptr++ )
ShowString( *string_ptr ) ;

使用特权

评论回复
7
反质子| | 2010-1-12 13:08 | 只看该作者
8楼正解
哈哈 最近正在研究指针与数组

使用特权

评论回复
8
mohanwei| | 2010-1-12 14:04 | 只看该作者
菜单这个东西,如果小,怎么做都无所谓;如果大了,不用“LCD_Disp("哈哈哈,今天天气真好");”这种方式的话,编写代码、管理字库都会让人很头大,尤其是后期的维护升级……
我写过最大一个100多页的,写的过程中终于发狠推倒重来,改成了“LCD_Disp("哈哈哈,今天天气真好");”,顺便连注释都省掉了。

使用特权

评论回复
9
zxm211| | 2010-1-12 15:38 | 只看该作者
8楼正确

使用特权

评论回复
10
冷漠| | 2010-1-12 16:35 | 只看该作者
还有简洁的:(学习了)
3、
while( *++string_ptr != NULL )
ShowString( *string_ptr ) ;

好像有个问题:第一个字符串漏掉了。能有办法解决吗?是不是只好添加一个虚拟字符串指针"ABC”充数第一项?例如:

const unsigned char *pstring[ ]={ “ABC”, shu_shuru_hz,ru_shuru_hz,mi_mima_hz,ma_mima_hz,0};

使用特权

评论回复
11
zjswuyunbo|  楼主 | 2010-1-12 17:03 | 只看该作者
12# 冷漠

按8楼的方法试了下,居然还是不行。。。。
不知8楼用的什么编译器?
我的是picc18.
这个编译器似乎是不支持  带汉字的字符串的

使用特权

评论回复
12
zjswuyunbo|  楼主 | 2010-1-12 17:26 | 只看该作者
另外,8楼似乎误解我的意思。。。。你的做法对二维数组是用的。但是,对我的似乎好像哪里不对。。。。
while( *++string_ptr != NULL )
  ShowOneChinese( *string_ptr ) ;
才是我的想的。。。。
杯具了。。。

使用特权

评论回复
13
HWM| | 2010-1-12 18:17 | 只看该作者
还有简洁的:(学习了)
3、
while( *++string_ptr != NULL )
ShowString( *string_ptr ) ;

好像有个问题:第一个字符串漏掉了。能有办法解决吗?是不是只好添加一个虚拟字符串指针"ABC”充数第一项?例如:

const ...
冷漠 发表于 2010-1-12 16:35

do
  ShowString(*String_ptr);
while( *++string_ptr != NULL );

不就行了吗?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
冷漠 + 1
14
冷漠| | 2010-1-12 19:48 | 只看该作者

14楼,我没做过实验。8楼、12楼意思一样?不是矩阵。

本帖最后由 冷漠 于 2010-1-12 19:50 编辑
while( *++string_ptr != NULL )
  ShowOneChinese( *string_ptr ) ;
才是我的想的。。。。


改成:
char const  **string_ptr=pstring;

while( *string_ptr != NULL )
{
ShowString( *string_ptr ) ;
string_ptr++ ;
}
行吗?

使用特权

评论回复
15
冷漠| | 2010-1-12 20:07 | 只看该作者
跟15楼HWM老师又学一招:
do
   ShowString(*String_ptr);
while( *++string_ptr != NULL );

上面和下面应该一样?14楼说不一样,值得共同探讨。
while( *string_ptr != NULL )
{
ShowString( *string_ptr ) ;
string_ptr++ ;
}

使用特权

评论回复
16
冷漠| | 2010-1-12 20:22 | 只看该作者
14楼,明白你的意思了。我再想想。

使用特权

评论回复
17
冷漠| | 2010-1-12 20:44 | 只看该作者
本帖最后由 冷漠 于 2010-1-12 21:00 编辑

函数定义:
void ShowString( const  unsigned char **str_p)
{
char **string_ptr=str_p;

while(*string_ptr!=NULL)
{
PutOneChinese(*string_ptr);
string_ptr++ ;
}
}

调用时:ShowString( pstring ) ; 即可。

使用特权

评论回复
18
冷漠| | 2010-1-12 20:54 | 只看该作者
本帖最后由 冷漠 于 2010-1-12 20:59 编辑

8楼改为:
void ShowString(const  unsigned char **str_p)
{
char **string_ptr=str_p;

do
   PutOneChinese(*string_ptr);
while( *++string_ptr != NULL );
}

使用特权

评论回复
19
冷漠| | 2010-1-13 11:09 | 只看该作者

送 LZ 10分。

本帖最后由 冷漠 于 2010-1-13 14:36 编辑
但是ShowString()里面的形参不知该如何定义?是用指针的指针还是指向数组的指针?



其实定义形参为指向数组的指针也行,和 pstring  类型相同即可,这样更好理解:

void ShowString ( const  unsigned char *str_p [ ]  )
基本概念:(只有)在函数原型说明或定义中,形参内 * 和 [ ] 可以等效代换。比较:
void ShowString (  const  unsigned char **str_p   )

这一点,可以请HWM老师给讲讲概念。

还有:“如果实参是数组,那么形参就应使用指针。* 或者 [ ]  在形参中都表示指针。”

LZ的问题如果能通过19、20楼基本概念方法所解决,其效果就是让咱菜鸟加深了概念学习和理解。好问题意义深远,送你10分。

使用特权

评论回复
20
反质子| | 2010-1-13 14:14 | 只看该作者
继续 学习了 顶

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

163

主题

1578

帖子

1

粉丝